题目地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=171

思路:简单DP一下就行,都是正数,边界问题不用考虑

AC代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>

const int inf = 0x7f7f7f7f;//2139062143
typedef long long ll;
using namespace std;

int dp[30][30];
int a[30][30];

int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
memset(dp,0,sizeof(dp));
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
scanf("%d",&a[i][j]);
}
}
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
dp[i][j] = max(dp[i-1][j],dp[i][j-1]) + a[i][j];
}
}
printf("%d\n",dp[n][m]);
}
return 0;
}

标称(边输入边DP,很巧妙)

#include<iostream>
using namespace std;
int f[22][22];
int main()
{
int n,m,c;
cin>>m>>n;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
cin>>c;
f[i][j]=max(f[i][j-1],f[i-1][j])+c;
}
cout<<f[m][n]<<endl;
}