Qiuqiqiu  
不管道路多么崎岖坎坷,我永远不停下追逐梦想的脚步!

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 }

 

posted on 2012-11-24 19:45  Qiuqiqiu  阅读(157)  评论(0编辑  收藏  举报