zoukankan      html  css  js  c++  java
  • 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
    没有人不辛苦,只有人不喊疼
  • 相关阅读:
    如何让 PADS Layout 识别到板框
    笔记:理想和挣钱
    笔记:知数据不知情况
    关于ie6下拖动滚动条时,div抖动的问题解决
    jQuery 中屏蔽浏览器的F5刷新功能
    jQuery 的append在ie下的兼容性
    协程
    进程
    操作系统的发展史
    python_控制台输出带颜色的文字方法
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/14542856.html
Copyright © 2011-2022 走看看