ACM PKU 2385 Apple Catching http://poj.org/problem?id=2385

这道题是典型的DP题,但是我的代码在poj上过了,在DUT的oj上却过不了,到现在也不知道错在哪儿了!

思路很明确,状态转移方程为:

  1. 如果苹果从1树上掉下来,有            dp[i][j][1]=max(dp[i-1][j][1],dp[i-1][j-1][2])+1;
                            dp[i][j][2]=dp[i-1][j][2];
  2. 如果苹果从2树上掉下来,有            dp[i][j][2]=max(dp[i-1][j-1][1],dp[i-1][j][2])+1;
                              dp[i][j][1]=dp[i-1][j][1];

意思是,当人在掉苹果的树下时可以直接拿到苹果,当人不在时,走一步可以拿到苹果,i标示的是时间,j标示的是走的次数,后面一维标示位置,dp[i][j][1]标示在i时刻走了j步在1树下拿到苹果的最大值;

下面附上代码:

 1 #include <iostream>
2 #include <string.h>
3 #include <stdio.h>
4 const int maxT=1005;
5 const int maxW=31;
6 using namespace std;
7
8 int apple[maxT][3];
9 int dp[maxT][maxW][3];
10
11 int solve(int T,int W)
12 {
13 int i,j;
14 if(apple[1][1])
15 {
16 dp[1][0][1]=1;
17 }
18 else if(apple[1][2])
19 {
20 dp[1][1][2]=1;
21 }
22 for(i=2;i<=T;i++)
23 for(j=0;j<=i&&j<=W;j++)
24 {
25 if(j==0)
26 {
27 dp[i][j][1]=dp[i-1][j][1]+apple[i][1];
28 dp[i][j][2]=dp[i-1][j][2]+apple[i][2];
29 continue;
30 }
31 if(apple[i][1])
32 {
33 dp[i][j][1]=max(dp[i-1][j][1],dp[i-1][j-1][2])+1;
34 dp[i][j][2]=dp[i-1][j][2];
35 }
36 else if(apple[i][2])
37 {
38 dp[i][j][2]=max(dp[i-1][j-1][1],dp[i-1][j][2])+1;
39 dp[i][j][1]=dp[i-1][j][1];
40 }
41 }
42 int ans=dp[T][W][1] > dp[T][W][2] ? dp[T][W][1]:dp[T][W][2];
43 return ans;
44 }
45
46 int main()
47 {
48 int T,W;
49 //freopen("in.txt","r",stdin);
50 while(scanf("%d%d",&T,&W)==2)
51 {
52 memset(apple,0,sizeof(apple));
53 memset(dp,0,sizeof(dp));
54 for(int i=1;i<=T;i++)
55 {
56 int temp;
57 scanf("%d",&temp);
58 apple[i][temp]=1;
59 }
60 int ans=solve(T,W);
61 printf("%d",ans);
62 }
63 return 0;
64 }

  这里如果有什么问题可以评论,自认为算法不是很完美,欢迎指正!

posted on 2011-08-10 17:22  _Clarence  阅读(165)  评论(0编辑  收藏  举报

导航