hdu 4374 单调队列优化dp
2013-10-21 09:59
330 查看
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define INF 0x7fffffff using namespace std; int n,m,x,t; int sum[105][10005]; void input() { int x; for(int i=1; i<=n; i++) { sum[i][0]=0; for(int j=1; j<=m; j++) { scanf("%d",&x); sum[i][j]=sum[i][j-1]+x; } } } struct node { int m,pos; }; node q[10005]; int dp[105][10005]; int solve() { for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) dp[i][j]=-500000005; } for(int i=1;i<=m;i++) dp[0][i]=-500000005; dp[0][x]=0; for(int i=1;i<=n;i++) { //dp[i-1][k1]-sum[i][k1-1] int head=1,tail=0; for(int j=1;j<=m;j++) { int tmp=dp[i-1][j]-sum[i][j-1]; while(head<=tail&&q[tail].m<=tmp) tail--; q[++tail].m=tmp; q[tail].pos=j; while(head<=tail&&q[head].pos<j-t) head++; dp[i][j]=max(dp[i][j],q[head].m+sum[i][j]); } head=1,tail=0; for(int j=m;j>=1;j--) { int tmp=dp[i-1][j]+sum[i][j]; while(head<=tail&&q[tail].m<=tmp) tail--; q[++tail].m=tmp; q[tail].pos=j; while(head<=tail&&q[head].pos>j+t) head++; dp[i][j]=max(dp[i][j],q[head].m-sum[i][j-1]); } } int ans=-500000005; for(int i=1;i<=m;i++) ans=max(ans,dp [i]); return ans; } int main() { while(scanf("%d%d%d%d",&n,&m,&x,&t)!=EOF) { input(); printf("%d\n",solve()); } return 0; }
相关文章推荐
- DLL注入技术之远线程注入
- init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear、viewWillUnload区别
- 正则表达式
- 深入探讨MFC消息循环和消息泵
- 64位Win7下编译hadoop 1.2.1问题解决
- 十个学会
- ssh移植
- VMware收购Desktone,完善了云服务策略
- atol函数简单实现
- Android Developers:针对电视优化导航
- 字节与字符有什么区别
- 实验5:函数
- 汉字转为unicode
- IOS开发之Cocoa编程—— NSUndoManager
- ubuntu下svn多仓库关于dav_svn.conf文件和authz文件的修改
- 蜂蜜,最佳护肤保养品
- MAC下ping整个局域网找到正在使用的ip地址并打印出来的脚本
- DLL注入
- homework-03
- 【复杂网络资料】实证网络数据和各种程序源码