[POJ1390]Blocks(dp)
来源:互联网 发布:淘宝代销刷单 编辑:程序博客网 时间:2024/06/01 23:34
题目描述
传送门
题解
这道dp想了很久都没有思路。这种消来消去的题目感觉用dp没法搞吖。
果然我还是太弱。
记忆化搜索的方法是看了网上的题解的。不过还是盯着那个状态看了很久才勉强理解。f(l,r,k)表示将l到r这一段区间并且连同r后面的k个和r相同颜色的方块都消完的最大得分。那么
实际上我认为这个转移很难理解。不过不想那么多的话也许更好想一点,其实就是分类讨论,
但是TA的方法更稳一点,而且更好理解。
那么
时间复杂度
代码
#include<iostream>#include<cstring>#include<cstdio>using namespace std;#define N 205int T,n,Case;int color[N],f[N][N][N];int dp(int l,int r,int k){ if (l>r) return 0; if (f[l][r][k]) return f[l][r][k]; f[l][r][k]=dp(l,r-1,0)+(k+1)*(k+1); for (int i=r-1;i>=l;--i) if (color[i]==color[r]) f[l][r][k]=max(f[l][r][k],dp(l,i,k+1)+dp(i+1,r-1,0)); return f[l][r][k];}int main(){ scanf("%d",&T); while (T--) { scanf("%d",&n); for (int i=1;i<=n;++i) scanf("%d",&color[i]); memset(f,0,sizeof(f)); printf("Case %d: %d\n",++Case,dp(1,n,0)); }}
Orz TA
#include<iostream>#include<cstring>#include<cstdio>using namespace std;#define N 205int T,n,Case;int color[N],tot[N][N],f[N][N][N],g[N][N];void clear(){ n=0; memset(f,128,sizeof(f)); memset(g,0,sizeof(g)); memset(tot,0,sizeof(tot));memset(color,0,sizeof(color));}int main(){ scanf("%d",&T); while (T--) { clear(); scanf("%d",&n); for (int i=1;i<=n;++i) scanf("%d",&color[i]); for (int i=1;i<=n;++i) for (int j=i+1;j<=n;++j) if (color[i]==color[j]) for (int k=i;k<=j;++k) if (color[k]==color[i]) tot[i][j]++; memset(f,128,sizeof(f)); memset(g,0,sizeof(g)); for (int i=1;i<=n;++i) f[i][i][0]=1,f[i][i][1]=0,g[i][i]=1; for (int len=2;len<=n;++len) for (int l=1;l<=n-len+1;++l) { int r=l+len-1; if (color[l]==color[r]) for (int k=1;k<=tot[l][r];++k) { for (int i=l;i<r;++i) f[l][r][k]=max(f[l][r][k],f[l][i][k-1]+g[i+1][r-1]); g[l][r]=max(g[l][r],f[l][r][k]+k*k); } for (int i=l;i<r;++i) g[l][r]=max(g[l][r],g[l][i]+g[i+1][r]); f[l][r][0]=g[l][r]; } printf("Case %d: %d\n",++Case,g[1][n]); }}
总结
0 0
- [POJ1390]Blocks(dp)
- [POJ1390]Blocks(区间dp)
- POJ1390 Blocks 区间DP
- poj1390 Blocks(区间dp)
- [POJ1390]Blocks(方块消除)
- poj1390 Blocks
- poj1390 Blocks
- POJ1390 Blocks 【动态规划】
- poj1390 方块消除 dp
- poj1390-dp消方块
- poj1390 (区间dp)
- poj1390
- poj1390
- poj1390区间dp+记忆化搜索
- UVa 10559 Blocks(DP)
- 10559 - Blocks(方块消除|DP)
- POJ 3734 Blocks(矩阵优化+DP)
- poj 1390 Blocks (区间dp)
- android:drawableLeft的用法
- R语言在线地图神器:Leaflet for R包(三) 符号标记
- 什么是野指针
- UVM overwrite
- IE7.JS解决IE兼容性问题方法
- [POJ1390]Blocks(dp)
- python 设置代理
- Eclipse如何导入一个已有的javaproject
- LightOJ1030-Discovering Gold-dp
- hdu 1573 X问题 水题 一元线性同余方程组
- css和js的浏览器兼容问题汇总
- How To Build CyanogenMod For Huawei Honor 5X ("kiwi")
- Database can't be started on Node 1 due to serverpool Max value is 1
- 文章标题