2985:数字组合
n个整数组合成一个指定的数
dp数组全部初始化为0,只初始化dp[i][0]=1;组合成0这个数有且只有一种做法, dp[i][j]=dp[i-1][j-a[i]]+dp[i-1][j];
只有dp[i][j]的组成部分中是dp[x][0]才能得出组合的种数,不出现dp[x][0]则组合不成,组合方法数为0
#include <bits/stdc++.h>
using namespace std;
int a[25];
int dp[25][1005];//还要构成1005且还有25个数可以选 的做法
int s[25];
int main(int argc, char** argv) {
int n,t;
cin>>n>>t;
// memset(s,0,sizeof(s));
for(int i=1;i<=n;i++){
cin>>a[i];
// s[i]=a[i]+s[i-1];
}
for(int i=0;i<=n;i++){
dp[i][0]=1;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=t;j++){//用i个数构成j
if(j-a[i]>=0){
dp[i][j]=dp[i-1][j-a[i]]+dp[i-1][j];
// dp[i][j]=dp[i-1][j];
}
else dp[i][j]=dp[i-1][j];
}
}
cout<<dp[n][t];
return 0;
}
2988:计算字符串距离
要么删除要么修改,算上1次,加上之前的操作数——修改那么考虑 s1字符串前i-1个字符和s2字符串前j-1个字符的距离,删除有两种:
1、删除s1第i个字符,那么考虑 s1字符串前i-1个字符和s2字符串前j个字符的距离
2、删除s2第j个字符,那么考虑 s1字符串前i个字符和s2字符串前j-1个字符的距离
#include <bits/stdc++.h>
using namespace std;
int dp[1005][1005];
int main(int argc, char** argv) {
ios::sync_with_stdio(false); cin.tie(0);
int n;
cin>>n;
string s1,s2;
while(n--){
cin>>s1>>s2;
memset(dp,0,sizeof(dp));
int len1=s1.size();
int len2=s2.size();
for(int i=1;i<=len1;i++){
dp[i][0]=i;
}
for(int i=1;i<=len2;i++){
dp[0][i]=i;
}
for(int i=1;i<=len1;i++){//s1字符串前i个字符,下标 0 ~ i-1
for(int j=1;j<=len2;j++){
if(s1[i-1]!=s2[j-1]){
dp[i][j]=min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]))+1;
}
// 要么删除要么修改,算上1次,修改那么考虑
// s1字符串前i-1个字符和s2字符串前j-1个字符的距离,删除有两种
else dp[i][j]=dp[i-1][j-1];
}
}
cout<<dp[len1][len2]<<endl;
}
return 0;
}