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 }

你可能感兴趣的:(help)