链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1338
很明显,这是一道动态规划的题,但是建议这道题最好用记忆化搜索去做,这样可以避免访问很多不可达的状态,也避免了很多判断,更可以增加时间效率
View Code
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define N 105 5 using namespace std; 6 typedef long long LL; 7 LL n,m,t; 8 LL dp[N][N][N];//dp[i][j][k]表示在第i秒跳第j次,到达点k所获得的最优解 9 LL v[N][N]; 10 LL max(LL a,LL b,LL c) 11 { 12 a=a>b?a:b; 13 return a>c?a:c; 14 } 15 LL dfs(LL in,LL jn,LL kn) 16 { 17 LL i,j; 18 if(dp[in][jn][kn]!=-1) 19 return dp[in][jn][kn]; 20 if(in==m) 21 return dp[in][jn][kn]=v[in][kn]; 22 if(jn==t) 23 dfs(in+1,jn,kn); 24 else 25 { 26 if(kn>1) 27 dfs(in+1,jn+1,kn-1); 28 if(kn<n) 29 dfs(in+1,jn+1,kn+1); 30 dfs(in+1,jn,kn); 31 } 32 return dp[in][jn][kn]=max(dp[in+1][jn+1][kn-1],dp[in+1][jn+1][kn+1],dp[in+1][jn][kn])+v[in][kn]; 33 } 34 int main() 35 { 36 LL i,j,k; 37 LL temp1,temp2; 38 LL icase=1; 39 while(cin>>n>>m>>t) 40 { 41 memset(dp,-1,sizeof(dp)); 42 memset(v,0,sizeof(v)); 43 for(i=1;i<=m;i++) 44 { 45 cin>>temp1>>temp2; 46 v[i][temp1]=temp2; 47 } 48 dfs(0,0,1); 49 cout<<"Scenario #"<<icase++<<endl; 50 cout<<dp[0][0][1]<<endl<<endl; 51 } 52 return 0; 53 }