HDU 1078
最近为了准备那个关于图算法的项目,一直看算法导论看的晕乎,还是尧师父说的在理,上手写代码才能发现问题有助于水平提高
这道题是一道DP,原本不太好想,不过题目限定老鼠奔跑只能从奶酪数低的往奶酪数高的洞跑,这样就可以定义出一个无后效性的状态,即,从(i,j)节点开始跑最多可以得到多少。
#include <iostream>
#include <algorithm>
#include <queue>
#include <string>
#include <vector>
#include <stack>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn= 105;
int n, k;
int mz[maxn][maxn];
int dv[maxn][maxn];
void Init()
{
memset(mz, -1, sizeof(mz));
memset(dv, -1, sizeof(dv));
}
int Dp(const int x, const int y)
{
if (dv[x][y] > -1){
return dv[x][y];
}
int a= 0;
int u= x-k > 1 ? x-k : 1;
int d= x+k < n ? x+k : n;
int l= y-k > 1 ? y-k : 1;
int r= y+k < n ? y+k : n;
for (int i= u; i<= d; ++i){
if (i== x){
continue;
}
if (mz[i][y]> mz[x][y]){
int ta= Dp(i, y);
if (ta> a){
a= ta;
}
}
}
for (int j= l; j<= r; ++j){
if (j== y){
continue;
}
if (mz[x][j]> mz[x][y]){
int ta= Dp(x, j);
if (ta> a){
a= ta;
}
}
}
return dv[x][y]= a+mz[x][y];
}
int main()
{
while (true){
scanf("%d %d", &n, &k);
if (-1== n){
break;
}
Init();
for (int i= 1; i<= n; ++i){
for (int j= 1; j<= n; ++j){
scanf("%d", mz[i]+j);
}
}
printf("%d\n", Dp(1, 1));
}
return 0;
}