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