AcWing复杂DP 打卡
1050. 鸣人的影分身
https://www.acwing.com/problem/content/1052/
思路:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<unordered_map>
using namespace std;
typedef long long LL;
int f[25][25];
int m,n;
int T;
int main(){
cin>>T;
while(T--){
memset(f,0,sizeof f);
cin>>m>>n;
f[0][0]=1;
for(int i=0;i<=m;i++){
for(int j=1;j<=n;j++){
f[i][j]=f[i][j-1];
if(i>=j){
f[i][j]+=f[i-j][j];
}
}
}
cout<<f[m][n]<<endl;
}
return 0;
}
// freopen("testdata.in", "r", stdin);
1047. 糖果
https://www.acwing.com/problem/content/1049/
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<unordered_map>
using namespace std;
typedef long long LL;
int n,k;
int w[105];
int f[105][105];//f(i,j)选择了i个物品 并且和除以k的余数为j
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>w[i];
}
memset(f,-0x3f,sizeof f);
f[0][0]=0;
for(int i=1;i<=n;i++){
for(int j=0;j<k;j++){
f[i][j]=max(f[i-1][j],f[i-1][(j+k-w[i]%k)%k]+w[i]);
}
}
cout<<f[n][0]<<endl;
return 0;
}
// freopen("testdata.in", "r", stdin);
1222. 密码脱落
https://www.acwing.com/problem/content/1224/
不难得出要添加多少的答案其实和 删除多少字符让它变成回文串
所以题目答案变成字符串长度-最大回文子序列
状态f(i,j) i到j的最大回文子序列

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<unordered_map>
using namespace std;
typedef long long LL;
char a[1005];
int f[1005][1005];//f(i,j) i到j的最大回文子序列
int main(){
cin>>a;
int n=strlen(a);
for(int len=1;len<=n;len++){
for(int i=0;i+len-1<n;i++){
int j=i+len-1;
if(len==1) f[i][j]=1;
else {
f[i][j]=max(f[i][j-1],f[i+1][j]);
if(a[i]==a[j]){
f[i][j]=max(f[i][j],f[i+1][j-1]+2);
}
}
}
}
cout<<n-f[0][n-1]<<endl;
return 0;
}
// freopen("testdata.in", "r", stdin);
1070. 括号配对
https://www.acwing.com/problem/content/1072/

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<unordered_map>
using namespace std;
typedef long long LL;
const int N = 110, INF = 100000000;
int n;
int f[N][N];
bool is_match(char l, char r)
{
if (l == '(' && r == ')') return true;
if (l == '[' && r == ']') return true;
return false;
}
int main(){
string s;
cin>>s;
n=s.size();
for(int len=1;len<=n;len++){
for(int i=0;i+len-1<n;i++){
int j=i+len-1;
f[i][j]=INF;
if(is_match(s[i],s[j])) f[i][j]=f[i+1][j-1];
if(j>=1) f[i][j]=min(f[i][j],min(f[i+1][j],f[i][j-1])+1);
for(int k=i;k<j;k++){
f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
}
}
}
cout<<f[0][n-1]<<endl;
return 0;
}
// freopen("testdata.in", "r", stdin);

浙公网安备 33010602011771号