bzoj 1910: [Ctsc2002] Award 颁奖典礼 动态规划
2016-04-09 21:01
239 查看
令f[i][j][k][x]表示第i行,从j~k列状态为x的时的最大值。x=0表示第一个矩形;x=1表示第二个矩形;x=2表示第三个矩形,然后构造两个辅助数组转移即可。
AC代码如下:
by lych
2016.4.9
AC代码如下:
#include<iostream> #include<cstdio> #include<cstring> #define N 205 using namespace std; int m,n,s ,dp[2] [3],g [2]; int main(){ scanf("%d%d",&m,&n); int i,j,k; for (i=1; i<=m; i++) for (j=1; j<=n; j++){ scanf("%d",&k); s[i][j]=s[i][j-1]+k; } memset(dp[0],192,sizeof(dp[0])); memset(g,192,sizeof(g)); int last,now=0,ans=0,x; for (i=1; i<=m; i++){ last=now; now^=1; memset(dp[now],200,sizeof(dp[now])); for (j=1; j<=n; j++) for (k=j; k<=n; k++) if (s[i][j-1]==s[i][k]){ x=k-j+1; dp[now][j][k][0]=max(dp[last][j][k][0],0)+x; dp[now][j][k][1]=max(dp[last][j][k][1],g[j][k][0])+x; ans=max(ans,dp[now][j][k][2]=max(dp[last][j][k][2],g[j][k][1])+x); } if (i==m) break; memset(g,192,sizeof(g)); for (j=2; j<n; j++) for (k=n-1; k>=j; k--) g[j][k][0]=max(max(g[j-1][k][0],g[j][k+1][0]),dp[now][j-1][k+1][0]); for (j=n-2; j; j--) for (k=j+2; k<=n; k++) g[j][k][1]=max(max(g[j+1][k][1],g[j][k-1][1]),dp[now][j+1][k-1][1]); } printf("%d\n",ans); return 0; }
by lych
2016.4.9
相关文章推荐
- sqlite数据库简介
- iOS依赖管理工具--CocoaPods
- 独立项目 - 2 - Mac配置retrolambda
- 算法:动态规划(新手勿喷)
- KMP算法
- Oracle配置文件详解 listener.ora,sqlnet.ora,tnames.ora
- Hbase 学习笔记5----hbase region, store, storefile和列簇的关系
- MS WORD 表格自己主动调整列宽,自己主动变美丽,依据内容自己主动调整
- html5学习系列之klm类标签
- LeetCode Best Time to Buy and Sell Stock II
- 最大子数组(C语言)
- 使用Princeton(普利斯顿大学)的Java标准库的方法
- 阿里音乐流行趋势预测大赛一起做-(2)weka初识
- request请求路径
- jrMz and angles
- 视频连接
- 【九度OJ】题目1202:排序
- CentOS 部署 Python3 的一些注意事项
- HDU 3879 Base Station 最小割
- DDMS 连接真机,用file explore看不到data/data文件夹的解决办法