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