这一题考察的就是记忆化搜索。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
using namespace std;
int map[105][105];
int dp[105][105];
int n,k;
int dri[4][2]={1,0,-1,0,0,1,0,-1};
int search(int a,int b)
{
int t=0,max=0;
int aa,bb;
if(dp[a][b]>0)
return dp[a][b];
for(int i=1;i<=k;i++)
for(int j=0;j<4;j++)
{
aa=a+dri[j][0]*i;
bb=b+dri[j][1]*i;
if(aa>0 && aa <=n && bb>0 && bb <=n && map[aa][bb]>map[a][b])
{
t=search(aa,bb);
if(t>max)
max=t;
}
}
dp[a][b]=map[a][b] + max;
return dp[a][b];
}
int main()
{
while(scanf("%d%d",&n,&k),n!=-1 || k!=-1)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%d",&map[i][j]);
dp[i][j]=0;
}
}
printf("%d\n",search(1,1));
}
return 0;
}
对动态规划的浅层理解:
动态规划最主要的就是写出状态及其状态转移方程。而其状态转移方程关键在于dp数组代表的意义。dp数组一般而言都会是代表从这一点起,以后的某个最优解,或者是在这之前的某个最优解。只要能写出其dp数组和状态转移方程,dp题目就不会很难了。