CodeForces - 1107E 区间DP

和紫书上的Blocks UVA - 10559 几乎是同一道题,只不过是得分计算不同

不过看了半天紫书上的题才会的,当时理解不够深刻啊

不过这是一道很好区间DP题

细节看代码

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define endl "\n"
#define maxn 100+5
int n;
char s[maxn];
long long a[maxn];
long long f[maxn][maxn][maxn];
long long f1[maxn];
bool vis[maxn][maxn][maxn];
long long DP(int l,int r,int k)
{
    if(l>r) return 0;
    if(vis[l][r][k]) return f[l][r][k];
    vis[l][r][k]=1;
    long long& ans=f[l][r][k];
    int cnt=0;
    int i=r;
    while(i>=l&&s[i]==s[r]) i--,cnt++;
    i++;
    ans=DP(l,i-1,0)+f1[cnt+k];//直接消除
    for(int j=l;j<i;j++){
        if(s[j]==s[r]&&s[j]!=s[j+1]) {
            ans=max(ans,DP(l,j,cnt+k)+DP(j+1,i-1,0));
        }
    }
    return ans;
}
main()
{
    scanf("%d",&n);
    scanf("%s",s+1);
    for(int i=1;i<=n;i++) scanf("%I64d",&a[i]);
    for(int i=1;i<=n;i++){
        f1[i]=a[i];
        for(int j=0;j<=i;j++){
            f1[i]=max(f1[i],f1[j]+f1[i-j]);
        }

    }
    cout<<DP(1,n,0);
}

猜你喜欢

转载自www.cnblogs.com/033000-/p/10459500.html
今日推荐