• CF1107E Vasya and Binary String(区间dp)


    看数据会猜到是区间dp

    这道题的精髓就是相同字符才能删除

    我们设计状态为删除f[i][j][k],i-j区间,后面有k个相同的在这次删除中一次删除

    那么状态转移,最后一位j可以选择和后面的删掉,或者如果区间内有和j相同的字符,可以与k一起被删掉。

    两种转移方式,虽然可能更新的时候有很多非法状态,但是我们并不会更新这些,并且我们保证合法状态已经更新了

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> pll;
    const int N=2e5+10;
    const int inf=0x3f3f3f3f;
    const int mod=1e9+7;
    const double eps=1e-4;
    ll f[110][110][110];
    int a[N];
    string s;
    int main(){
        ios::sync_with_stdio(false);
        int n;
        cin>>n;
        cin>>s;
        s=" "+s;
        int i,j,k;
        for(i=1;i<=n;i++)
            cin>>a[i];
        for(i=0;i<=n;i++){
            for(j=i;j<=n;j++){
                for(k=0;k<=n;k++){
                    f[i][j][k]=-1e18;
                }
            }
            for(k=0;k<=n-i;k++)
                f[i][i][k]=a[k+1];
        }
        for(int len=2;len<=n;len++){
            for(i=1;i+len-1<=n;i++){
                int j=i+len-1;
                for(k=0;k<=n-j;k++){
                    f[i][j][k]=max(f[i][j][k],f[i][j-1][0]+a[k+1]);
                }
                for(k=0;k<=n-j;k++){
                    for(int l=i;l<j;l++){
                        if(s[l]==s[j]){
                            f[i][j][k]=max(f[i][j][k],f[i][l][k+1]+f[l+1][j-1][0]);
                        }
                    }
                }
            }
        }
        cout<<f[1][n][0]<<endl;
        return 0;
    }
    View Code
    没有人不辛苦,只有人不喊疼
  • 相关阅读:
    Koa初探
    npm 安装electron 失败的问题和解决办法
    vscode常用快捷键
    docker 执行TP 的 migrate数据库迁移报错2002
    git删除历史记录中的大文件详解
    js replace 替换路径无效的问题
    window.prompt()方法数据类型问题
    scorecardpy 介绍
    CatBoost 使用
    webgl
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/14542856.html
Copyright © 2020-2023  润新知