本題是一個很基礎的動態規劃,與動態規劃裏的最短路徑類似。本題可以採用標記數組,也可以不採用標記數組。(本代碼未採用標記數組)
本題的動規思想主要是每一步的最優解都取決於上一步的最優解,以達到整體最優的目的。
代碼如下:
#include<stdio.h> #define max(a,b) (a>b?a:b) #define MAX_N 25 #define MAX_M 25 int map[MAX_N][MAX_M]; int main(void) { int n,m; // n行 m列 int i,j; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { scanf("%d",&map[i][j]); } } for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { map[i][j]=max(map[i-1][j],map[i][j-1])+map[i][j]; // printf("%d\t",map[i][j]); } // printf("\n"); } printf("%d\n",map[n][m]); return 0; }
本代碼需要注意的還有一點就是運算符的優先級問題,三目運算符 ? : 的優先級較低,要用小括號將其括起來,否則程序會出錯。