数字三角形🍂
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
vector<vector<int>>arr(n+1,vector<int>(n+1,0));
for(int i =1;i<=n;i++)
{
for(int j = 1;j<=i;j++)
{
cin>>arr[i][j];
}
}
vector<vector<int>>dp(n+1,vector<int>(n+1,0));
for(int i=1;i<=n;i++)
{
dp[n][i] = arr[n][i];
}
for(int i=n-1;i>=1;i--)
{
for(int j=1;j<=i;j++)
{
dp[i][j] = max(dp[i+1][j],dp[i+1][j+1])+arr[i][j];
}
}
cout<<dp[1][1]<<endl;
return 0;
}
最长上升子序列🍂
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
vector<int>arr(n,0);
vector<int>dp(n,1);
for(int i=0;i<n;i++) cin>>arr[i];
int ans = 1; //最小值也应该是1,不能写0这里
for(int i=1;i<n;i++)
{
for(int j = i-1;j>=0;j--)
{
if(arr[j]<arr[i]) dp[i] = max(dp[i],dp[j]+1);
}
ans = max(ans,dp[i]);
}
cout<<ans<<endl;
return 0;
}
最长公共子序列🍂
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
char a[N],b[N];
int dp[N][N];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i]; //输入不能用string ,是因为默认的第一个字母是a[0],
//但是我们想要把第一个字母放在a[1]的位置上,因为后面循环中会有i-1,j-1
for(int j=1;j<=m;j++) cin>>b[j];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i]==b[j]) dp[i][j] = dp[i-1][j-1]+1;
else dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
}
}
cout<<dp[n][m]<<endl;
return 0;
}
最短编辑距离🍂
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
char a[N],b[N];
int dp[N][N];
int main()
{
int n,m;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
cin>>m;
for(int j=1;j<=m;j++) cin>>b[j];
//初始化边界值
for(int j=1;j<=m;j++) dp[0][j] = j;
for(int i=1;i<=n;i++) dp[i][0] = i;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i]==b[j]) dp[i][j] = dp[i-1][j-1]; //两个值相等不需要替换,也不需要插入删除
else dp[i][j] = min(dp[i-1][j],min(dp[i][j-1],dp[i-1][j-1]))+1;
//对应的dp[i][j-1]是增加操作,行方向上的,dp[i-1][j]是列变换,是删除操作,最后dp[i-1][j-1]是替换操作
}
}
cout<<dp[n][m]<<endl;
return 0;
}
编辑距离🍂
#include<bits/stdc++.h>
using namespace std;
const int N = 20;
char arr[N][N];
int min_bian(string arr,string brr)
{
char a[N],b[N];
int m = arr.size();
int n = brr.size();
// cout<<m<<endl;
// cout<<n<<endl;
for(int i = 1;i<=m;i++) a[i] = arr[i-1];
for(int j = 1;j<=n;j++) b[j] = brr[j-1];
int dp[N][N]={0};//记得要初始化
for(int i = 1;i<=m;i++) dp[i][0] = i;
for(int j = 1;j<=n;j++) dp[0][j] = j;
for(int i = 1;i<=m;i++)
{
for(int j = 1;j<=n;j++)
{
if(a[i]==b[j]) dp[i][j] = dp[i-1][j-1];
else dp[i][j] = min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]))+1;
}
}
return dp[m][n];
}
int main()
{
int n,m;
cin>>n>>m;
vector<string>arr(n); //可以存放n个字符串
for(int i = 0;i<n;i++) cin>>arr[i];
string b;
int x,sum;
while(m--)
{
sum=0;
cin>>b>>x;
for(int i = 0;i<n;i++)
{
if(min_bian(arr[i],b)<=x) sum++;
}
cout<<sum<<endl;
}
return 0;
}