(精)聪明的kk(动态规划)

来源:互联网 发布:格式化硬盘还能恢复数据吗 编辑:程序博客网 时间:2024/06/05 02:30
#include<iostream>#include<stdio.h>using namespace std;#define MAX 25int 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;}