原题链接

题目大意:FM在一个街道n*n街道的(0,0)点,在每个网格里放着cheese,他要尽可能多的吃这些cheese。有两个规则:1)他跑的总距离不能超过k步;2)下一个节点的cheese的块数必须超过这个节点。

解法:题目是去年秋天做的,现在看了下貌似就是用一下广搜,从原点开始一个个查找。我直接把当时的代码贴过来了,看看当时写的注释,发现暑假都过了一半了,算法都没有总结好。惭愧了。

 

参考代码:

#include<string.h>
using namespace std;

int n,k,x,y,block[102][102],dp[102][102];
int a[4][2]={{1,0},{-1,0},{0,1},{0,-1}};

int BSF(int, int);

int main(){
	int i,j;

	while(cin>>n>>k){
		if(n==-1&&k==-1) break;
		x=y=1;
		memset(block,-1,sizeof(block));
		for(i=1;i<=n;i++)
			for(j=1;j<=n;j++)
				cin>>block[i][j];
		memset(dp,-1,sizeof(dp));
		BSF(1,1);
		cout<<dp[1][1]<<endl;
	}


	return 0;
}

int BSF(int x, int y){
	int i,j,max,sx,sy,temp;
	if(dp[x][y]!=-1){
		return dp[x][y];
	}
	else{
		max=0;
		for(i=0;i<4;i++){
			for(j=1;j<=k;j++){
				sx=x+a[i][0]*j;
				sy=y+a[i][1]*j;
				if(sx<1||sx>n||sy<1||sy>n)continue;	//这个判断很重要,不然超出数组边界就要segmental fault了
				if(block[sx][sy]>block[x][y]){
					temp=BSF(sx,sy);
					if(max<temp) max=temp;
				}
			}
		}
		dp[x][y]=max+block[x][y];	//递归函数的返回处理最讨厌了
		return dp[x][y];
	}
}