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 }