题目大意: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];
}
}