NYOJ-171 第三届河南省ACM竞赛 聪明的KK (简单的DP)
此题是数字三角形的变形,有些细节要注意,当KK走倒最后一列是只能向下走,当KK走到最后一行时,只能向右走;
这两种情况要单独考虑。d[i][j]指在i,j这个位置走到右下角所能吃的虫子数目。
View Code
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4
5 int main()
6 {
7 int i,j,N,M;
8 int a[25][25],d[25][25];
9
10 scanf("%d%d",&N,&M);
11 for(i=1; i<=N; i++)
12 for(j=1; j<=M; j++)
13 {
14 scanf("%d",&a[i][j]);
15 }
16 memset(d,0,sizeof(d));
17 d[N][M] = a[N][M];
18 for(j=M-1; j>=1; j--)//最后一行每个位置到右下角所吃虫子最大数
19 {
20 d[N][j] = a[N][j] + d[N][j+1];
21 }
22 for(i=N-1; i>=1; i--)//最后一列每个位置到右下角所能吃的虫子最大数
23 {
24 d[i][M] = a[i][M] + d[i+1][M];
25 }
26 for(i=N-1; i>=1; i--)
27 for(j=M-1; j>=1; j--) //从下往上递推求解
28 {
29 if(d[i+1][j] >= d[i][j+1]) //i,j位置的右边比左边大
30 d[i][j] = a[i][j] + d[i+1][j];
31 else if(d[i+1][j] < d[i][j+1])
32 d[i][j] = d[i][j+1] + a[i][j];
33 }
34 printf("%d\n",d[1][1]);
35 //system("pause");
36 return 0;
37 }
38