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);
posted @ 2021-05-19 09:26  一个经常掉线的人  阅读(42)  评论(0)    收藏  举报