拿金币
问题描述
有一个N x N的方格,每一个格子都有一些金币,只要站在格子里就能拿到里面的金币。你站在最左上角的格子里,每次可以从一个格子走到它右边或下边的格子里。请问如何走才能拿到最多的金币。
输入格式
第一行输入一个正整数n。
以下n行描述该方格。金币数保证是不超过1000的正整数。
输出格式
最多能拿金币数量。
样例输入
3
1 3 3
2 2 2
3 1 2
样例输出
11
数据规模和约定
n<=1000
C代码
很经典的dp动态规划题,这里不过多解释
#include <stdio.h>
#include <stdlib.h>
int main(){
//读取数据
int N = 0, i = 0, j = 0;
scanf("%d",&N);
int** arr = (int**)malloc(sizeof(int*) * N);
for(i=0;i<N;i++){
arr[i] = (int*)malloc(sizeof(int) * N);
for(j=0;j<N;j++){
scanf("%d", &arr[i][j]);
}
}
//DP计算
//为节省空间使用滚动数组
int* dp = (int*)malloc(sizeof(int) * N);
dp[0] = arr[0][0];
for(j=1;j<N;j++)
dp[j] = dp[j-1] + arr[0][j];
for(i=1;i<N;i++){
dp[0] = dp[0] + arr[i][0];
for(j=1;j<N;j++){
dp[j] = dp[j-1] > dp[j] ? (dp[j-1] + arr[i][j]) : (dp[j] + arr[i][j]);
}
}
printf("%d",dp[N-1]);
return 0;
}