设 d[ i ][ j ] 表示走到坐标为(i, j)的格子时最大的幸运值。
初始化:dp[i][j]的第0行和第0列初始化为负的无穷大。。、
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int map[25][1005],dp[25][1005]; int main() { int t,n,m,i,j,k; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i = 1; i<=n; i++) for(j = 1; j<=m; j++) scanf("%d",&map[i][j]); for(i = 0; i<=n; i++) dp[i][0] = -99999999; for(i = 0; i<=m; i++) dp[0][i] = -99999999; dp[1][0] = dp[0][1] = 0; for(i = 1; i<=n; i++) { for(j = 1; j<=m; j++) { dp[i][j] = max(dp[i-1][j],dp[i][j-1]); for(k = 2; k<=m; k++) { if(j%k==0)//找倍数关系 dp[i][j] = max(dp[i][j],dp[i][j/k]); } dp[i][j]+=map[i][j]; } } printf("%d\n",dp[n][m]); } return 0; }