hdu1494 二维dp表示到i段还有j个能量槽

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 using namespace std;
 5 int a[10005],b[10005];
 6 int dp[10005][20];
 7 int main()
 8 {
 9     int n,k,i,j,cnt;
10     while(~scanf("%d%d",&n,&k))
11     {
12         for (i=1;i<=n;i++) scanf("%d",&a[i]);
13         for (i=1;i<=n;i++) scanf("%d",&b[i]);
14         cnt=n;
15         for (j=2;j<=k;j++)
16             for (i=1;i<=n;i++)
17             {
18                 cnt++;
19                 a[cnt]=a[cnt-n];
20                 b[cnt]=b[cnt-n];
21             }
22         n=cnt;
23         for (i=0;i<=n;i++)
24             for (j=0;j<15;j++) dp[i][j]=0x3f3f3f3f;
25         dp[0][0]=0;
26         for (i=1;i<=n;i++)
27             for (j=0;j<15;j++)
28         {
29             if (j==0) dp[i][j]=dp[i-1][j+5]+b[i];
30             else if (j>10) dp[i][j]=dp[i-1][j-1]+a[i];
31             else if (j==10) dp[i][j]=min(dp[i-1][j+4]+a[i],dp[i-1][j-1]+a[i]);
32             else dp[i][j]=min(dp[i-1][j-1]+a[i],dp[i-1][j+5]+b[i]);
33         }
34         k=0x3f3f3f3f;
35         for (i=0;i<=10;i++)
36             if (dp[n][i]<k) k=dp[n][i];
37         printf("%d\n",k);
38     }
39 }

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1494

posted on 2014-11-05 21:51  xiao_xin  阅读(106)  评论(0编辑  收藏  举报

导航