#include<iostream>
#include<stdio.h>
using namespace std;
#define MAX 25
int map[MAX][MAX];
int collect[MAX][MAX];
int dir[2][2]={{1,0},{0,1}};
int N,M;
class Point
{
public:
int col;
int row;
};
void init()
{
int i,j;
for(i=0;i<MAX;i++)
for(j=0;j<MAX;j++)
collect[i][j]=-1;
}
int over(Point p)
{
if(p.col<0||p.row<0)
return 1;
if(p.col>=M||p.row>=N)
return 1;
return 0;
}
int dp(Point p)
{
//如果这个店访问过
if(collect[p.row][p.row]!=-1)
{
return collect[p.row][p.col];
}
int tmax=-1;int i=0;
Point cs;
for(i=0;i<2;i++)
{
cs.row=p.row+dir[i][0];cs.col=p.col+dir[i][1];
//如果没有溢出
if(!over(cs))
{
int fmax=dp(cs);
if(tmax<fmax)
tmax=fmax;
}
}
if(tmax==-1)
{
collect[p.row][p.col]=map[p.row][p.col];
}
else
{
collect[p.row][p.col]=tmax+map[p.row][p.col];
}
return collect[p.row][p.col];
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d%d",&N,&M)!=EOF)
{
//初始化
init();
int i,j;
//输入
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{
scanf("%d",&map[i][j]);
}
}
//输出
Point start;start.row=0;start.col=0;
int result=dp(start);
cout<<result<<endl;
}
return 0;
}
(精)聪明的kk(动态规划)
最新推荐文章于 2017-10-27 15:32:13 发布