题解 P2135 【方块消除】
blog更好的阅读体验
区间dp。
难点在于你消除一块后,它还会自动并上。所以如果直接定义两维状态
定义状态
对于当前状态
决策一
直接炸掉
决策二
分段处理,将区间分成两部分,每部分单独考虑贡献,然后相加。
在
特殊地,当
具体转移可以采用记搜方式,代码如下
#include<bits/stdc++.h>
using namespace std;
const int N=205;
int f[N][N][N],a[N];
int co[N],len[N];
int solve(int l,int r,int lx){
int all=len[r]+lx;
if(l==r)return all*all;
if(~f[l][r][lx])return f[l][r][lx];
int res=solve(l,r-1,0)+all*all;
for(int k=l;k<r;k++){
if(co[k]==co[r])res=max(res,solve(k+1,r-1,0)+solve(l,k,all));
}
return f[l][r][lx]=res;
}
int main(){
int n;scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&co[i]);
for(int i=1;i<=n;i++)scanf("%d",&len[i]);
memset(f,-1,sizeof(f));
printf("%d\n",solve(1,n,0));
}
upd
双倍经验[UVA10559 Blocks],基本一样,预处理一下每个块的颜色长度即可。