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;
}
posted @ 2021-04-01 22:54  IdiotNe  阅读(39)  评论(0编辑  收藏  举报