1073: 矩阵取数Ⅰ
时间限制: 1 Sec 内存限制: 128 MB
题目描述
PIPI想要大家了解基本的动态规划,所以它不知道从哪弄来了一个n*m的矩阵,矩阵每个元素是一个整数,你现在在左上角(第一行第一列),你需要走到右下角(第n行,第m列),每次只能朝右或者下走到相邻的位置,不能走出矩阵。走过的数的总和作为你的得分,求最大的得分。
怎么样,是不是很简单呢?
输入
多组输入。
第一行为两个整数n,m(1<=n,m<=500)
接下来n行,每行m个数字,每个数字都在int范围内。( ̄▽ ̄)"
输出
对于每组数据,输出最大和。
样例输入
4 4 1 2 3 4 1 2 8 2 10 1 1 5 1 1 1 1
样例输出
22
来源/分类
代码:
#include<stdio.h>
int a[501][501];
long long dp[501][501];
long long max(long long a,long long b){
if(a>b)
return a;
else
return b;
}
long long getmax(int n,int m){
int i,j;
dp[0][0]= a[0][0];
for(i=1;i<n;i++){
dp[i][0] = dp[i-1][0]+a[i][0];
}
for(i=1;i<m;i++){
dp[0][i] = dp[0][i-1]+a[0][i];
}
for(i=1;i<n;i++){
for(j=1;j<m;j++){
dp[i][j] = max(dp[i-1][j],dp[i][j-1])+a[i][j];
}
}
return dp[n-1][m-1];
}
int main(){
int m,n;
while(scanf("%d%d",&n,&m)!=EOF){
int i,j;
for(i=0;i<n;i++){
for(j=0;j<m;j++){
scanf("%d",&a[i][j]);
}
}
long long result = getmax(n,m);
printf("%lld\n",result);
}
}