hdu 4374 One hundred layer http://acm.hdu.edu.cn/showproblem.php?pid=4374 2012-12-3
dp[i][j]=max{ max{dp[i-1][k]+sum[j]-sum[k-1]} (j-t<=k<=j), max{dp[i-1][k]+sum[k]-sum[j-1]} (j<=k<=j+k) }
View Code
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 6 const int N=110,M=10010,INF=1000000000; 7 int n,m; 8 int a[N][M],sum[N][M],dp[N][M]; 9 int val[M],q[M]; 10 int main() 11 { 12 int n,m,x,t; 13 while(~scanf("%d%d%d%d",&n,&m,&x,&t)) 14 { 15 for(int i=1;i<=n;i++) 16 for(int j=1;j<=m;j++) scanf("%d",&a[i][j]); 17 for(int i=1;i<=n;i++) 18 for(int j=0;j<=m;j++) sum[i][j]=(j==0?0:sum[i][j-1]+a[i][j]); 19 for(int i=0;i<=n;i++) 20 for(int j=1;j<=m;j++) dp[i][j]=-INF; 21 dp[0][x]=0; 22 for(int i=1;i<=n;i++) 23 { 24 int front=0,rear=0; 25 for(int j=1;j<=m;j++) 26 { 27 val[j]=dp[i-1][j]-sum[i][j-1]; 28 while(rear>front && val[j]>val[q[rear-1]]) rear--; 29 q[rear++]=j; 30 while(rear>front && q[front]<j-t) front++; 31 dp[i][j]=max(dp[i][j],val[q[front]]+sum[i][j]); 32 } 33 front=rear=0; 34 for(int j=m;j>0;j--) 35 { 36 val[j]=dp[i-1][j]+sum[i][j]; 37 while(rear>front && val[j]>val[q[rear-1]]) rear--; 38 q[rear++]=j; 39 while(rear>front && q[front]>j+t) front++; 40 dp[i][j]=max(dp[i][j],val[q[front]]-sum[i][j-1]); 41 } 42 } 43 int ans=0; 44 for(int i=1;i<=m;i++) ans=max(ans,dp[n][i]); 45 printf("%d\n",ans); 46 } 47 return 0; 48 }
hdu 3933 Dark Parth http://acm.hdu.edu.cn/showproblem.php?pid=3933
dp[i][j]=min{dp[i-1][j]+a[i], dp[k][j]} (i-lb<=k<=i-la)
View Code
1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 5 const int N=1010; 6 struct node 7 { 8 int pos,val; 9 node(){} 10 node(int p,int v):pos(p),val(v){} 11 }q[N]; 12 int a[N],dp[110][N]; 13 int main() 14 { 15 int n; 16 while(scanf("%d",&n),n) 17 { 18 int la,lb,m; 19 scanf("%d%d%d",&lb,&la,&m); 20 dp[0][0]=0; 21 for(int i=1;i<=n;i++) 22 { 23 scanf("%d",&a[i]); 24 dp[0][i]=dp[0][i-1]+a[i]; 25 } 26 for(int i=1;i<=m;i++) 27 { 28 dp[i][0]=0; 29 int front,rear; 30 front=rear=0; 31 for(int j=1;j<=n;j++) 32 { 33 dp[i][j]=dp[i][j-1]+a[j]; 34 if(j<la) continue; 35 while(rear>front && dp[i-1][j-la]<q[rear-1].val) rear--; 36 q[rear++]=node(j-la,dp[i-1][j-la]); 37 while(rear>front && q[front].pos<j-lb) front++; 38 if(q[front].val<dp[i][j]) dp[i][j]=q[front].val; 39 } 40 } 41 printf("%d\n",dp[m][n]); 42 } 43 return 0; 44 }