HDU 1712 ACboy needs your help(二维DP)

题目链接

中规中矩的二维DP,披着背包的外衣,但感觉和背包没有毛线关系吧。

状态转移 p[i][j] = max(p[i-1][j-k]+o[i][k]) k:0 to j   i代表课程j代表时间.

 1 #include <stdio.h>
 2 #include <string.h>
 3 int p[101][101],o[101][101];
 4 int main()
 5 {
 6     int i,j,k,n,m,max;
 7     while(scanf("%d%d",&n,&m)!=EOF)
 8     {
 9         if(!n&&!m) break;
10         memset(p,0,sizeof(p));
11         memset(o,0,sizeof(o));
12         for(i = 1;i <= n;i ++)
13         {
14             for(j = 1;j <= m;j ++)
15             scanf("%d",&o[i][j]);
16         }
17         for(i = 1;i <= m;i ++)
18         {
19             p[1][i] = o[1][i];
20         }
21         for(i = 2;i <= n;i ++)
22         {
23             for(j = 0;j <= m;j ++)
24             {
25                 max = 0;
26                 for(k = 0;k <= j;k ++)
27                 {
28                     if(max < p[i-1][j-k] + o[i][k])
29                     max = p[i-1][j-k] + o[i][k];
30                 }
31                 p[i][j] = max;
32             }
33         }
34         max = 0;
35         for(i = 1;i <= m;i ++)
36         {
37             if(max < p[n][i])
38             max = p[n][i];
39         }
40         printf("%d\n",max);
41     }
42     return 0;
43 }
posted @ 2012-07-27 20:28  Naix_x  阅读(150)  评论(0编辑  收藏  举报