题解
代码量小的离谱,思维难度大的离谱
对于两个原本不相邻的同色区域块,历经千辛万苦碰面的场景,我们可以描述成右边的区域块为左边的区域块消除的时候增添了长度
设 \(dp[i][j][suf]\) 代表消除区域 \([i,j]\) 同时该区域的 \(j\) 增添了长度 \(suf\)
但是合并消除不一定是最优的,因为可能破坏中间的可能长度更长的合并块
所以初始化是不合并的情况
然后寻找所有可能合并的区域块,完成上述操作
tai chou xiang le!!!
suf是向下传递的
code
#include<bits/stdc++.h>
using namespace std;
int dp[55][55][1005]={0},a[55]={0},num[55]={0};
int ss(int l,int r,int suf)
{
if(l>r) return 0;
if(dp[l][r][suf]) return dp[l][r][suf];
if(l==r) return (dp[l][r][suf]=(num[r]+suf)*(num[r]+suf));
dp[l][r][suf]=ss(l,r-1,0)+(num[r]+suf)*(num[r]+suf);
for(int i=l;i<r;i++) if(a[i]==a[r]) dp[l][r][suf]=max(dp[l][r][suf],ss(l,i,suf+num[r])+ss(i+1,r-1,0));//中间的消除
return dp[l][r][suf];
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>num[i];
cout<<ss(1,n,0);
return 0;
}
标签:suf,return,方块,int,55,P2135,num,消除,dp
From: https://www.cnblogs.com/pure4knowledge/p/18057484