哈理工OJ 1338-Monkey CC解题报告

链接: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 }

 

posted @ 2012-04-09 19:15  zhenhai  阅读(288)  评论(0编辑  收藏  举报