[关闭]
@ysner 2018-09-18T16:00:45.000000Z 字数 1173 阅读 2162

[UVA10559]Blocks

DP


题面

个带有颜色的方块,消除一段长度为的连续的相同颜色的方块可以得到的分数。
用一种最优的顺序消除所有方块使得得分最多。

解析

状态相当神仙。。。转移也很神仙。。。
表示处理区间,后面还有个和右端点颜色相同的方块。
然后有三种转移:

据此记搜即可。

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cmath>
  4. #include<cstdio>
  5. #include<cstdlib>
  6. #include<algorithm>
  7. #define ll long long
  8. #define re register
  9. #define il inline
  10. #define fp(i,a,b) for(re int i=a;i<=b;i++)
  11. #define fq(i,a,b) for(re int i=a;i>=b;i--)
  12. using namespace std;
  13. int T,n,f[205][205][205],a[205];
  14. il ll gi()
  15. {
  16. re ll x=0,t=1;
  17. re char ch=getchar();
  18. while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
  19. if(ch=='-') t=-1,ch=getchar();
  20. while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
  21. return x*t;
  22. }
  23. il int pf(re int x){return x*x;}
  24. il int dfs(re int l,re int r,re int k)
  25. {
  26. if(~f[l][r][k]) return f[l][r][k];
  27. if(l>r) return 0;
  28. re int &x=f[l][r][k],p;
  29. x=dfs(l,r-1,0)+pf(k+1);
  30. fp(i,l,r-1) p=dfs(l,i,0)+dfs(i+1,r,k),x=(x>p)?x:p;
  31. fp(i,l,r-1)
  32. if(a[i]==a[r]) p=dfs(l,i,k+1)+dfs(i+1,r-1,0),x=(x>p)?x:p;
  33. return x;
  34. }
  35. int main()
  36. {
  37. re int T=gi();
  38. fp(o,1,T)
  39. {
  40. n=gi();
  41. fp(i,1,n) a[i]=gi();
  42. memset(f,-1,sizeof(f));
  43. printf("Case %d: %d\n",o,dfs(1,n,0));
  44. }
  45. return 0;
  46. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注