3 1 1 2 5 10 11 6 12 12 7 -1 -1
37
Zhejiang University Training Contest 2001
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1078
题意:老鼠从(0,0)开始走,每次最多只能走k步停下来,停下的这个位置只能比上一个停留的位置大,并获取其价值,每次只能水平或垂直走,问最大能得到的价值
记忆化搜索
#include <iostream> #include <cstring> #include <algorithm> using namespace std; int n,k; int a[105][105],sum[105][105]; int dir[4][2]={0,1,1,0,0,-1,-1,0}; bool OK(int x,int y) { if(x<0||x>=n||y<0||y>=n) return false; return true; } int DFS(int x,int y) { int ans=0; if(sum[x][y]) return sum[x][y]; for(int i=0;i<4;i++) { for(int j=1;j<=k;j++) { int xx=x+dir[i][0]*j; int yy=y+dir[i][1]*j; if(OK(xx,yy)&&a[xx][yy]>a[x][y]) { /** int k=DFS(xx,yy); ans=max(ans,k); */ ans=max(ans,DFS(xx,yy)); } } } sum[x][y]=ans+a[x][y]; return sum[x][y]; } int main() { while(cin>>n>>k) { if(n==-1&&k==-1) break; for(int i=0;i<n;i++) for(int j=0;j<n;j++) cin>>a[i][j]; memset(sum,0,sizeof(sum)); cout<<DFS(0,0)<<endl; } return 0; }
//dp[i][j]表示从点i,j处开始能获得的最多cheese #include <iostream> #include <string.h> #include <stdio.h> #include <algorithm> using namespace std; int n,k,dp[101][101],mapp[101][101]; int dfs(int a,int b) { if(dp[a][b]) return dp[a][b]; dp[a][b] = mapp[a][b]; for(int i = 1; i<=k; i++) { if(a+i<n&&mapp[a+i][b]>mapp[a][b]) dp[a][b] = max(dp[a][b],dfs(a+i,b)+mapp[a][b]); if(a-i>=0&&mapp[a-i][b]>mapp[a][b]) dp[a][b] = max(dp[a][b],dfs(a-i,b)+mapp[a][b]); if(b-i>=0&&mapp[a][b-i]>mapp[a][b]) dp[a][b] = max(dp[a][b],dfs(a,b-i)+mapp[a][b]); if(b+i<n&&mapp[a][b+i]>mapp[a][b]) dp[a][b] = max(dp[a][b],dfs(a,b+i)+mapp[a][b]); } return dp[a][b]; } int main(void) { while(scanf("%d %d",&n,&k)!=EOF) { if(n==-1&&k==-1) break; for(int i = 0; i<n; i++) { for(int j = 0; j<n; j++) scanf("%d",&mapp[i][j]); } memset(dp,0,sizeof(dp)); printf("%d\n",dfs(0,0)); } }
#include <iostream> #include <cstring> using namespace std; int n,k; int a[105][105]; int maxa; int dir[4][2]={0,1,1,0,0,-1,-1,0}; bool OK(int x,int y) { if(x<0||x>=n||y<0||y>=n) return false; return true; } void DFS(int x,int y,int sum) { if(sum>maxa) { maxa=sum; } for(int i=1;i<=k;i++) { for(int j=0;j<4;j++) { int xx=x+dir[j][0]*i; int yy=y+dir[j][1]*i; if(OK(xx,yy)&&a[xx][yy]>a[x][y]) { DFS(xx,yy,sum+a[xx][yy]); } } } } int main() { while(cin>>n>>k) { if(n==-1&&k==-1) break; for(int i=0;i<n;i++) for(int j=0;j<n;j++) cin>>a[i][j]; maxa=0; DFS(0,0,a[0][0]); cout<<maxa<<endl; } }