P2690 接苹果

P2690 接苹果
f[i][j][k]表示
i=1或2,表示j时刻cow在哪棵树下
j表示时刻
k表示转移了k次
如果当前第1棵树落苹果
f[1][t][left]=max(f[1][t-1][left],f[2][t-1][left-1])+1;
如果当前第2棵树落苹果
f[2][t][left]=max(f[2][t-1][left],f[1][t-1][left-1])+1;

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<queue>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<ctime>
 7 #include<cstring>
 8 #define inf 2147483647
 9 #define For(i,a,b) for(register int i=a;i<=b;i++)
10 #define p(a) putchar(a)
11 #define g() getchar()
12 //by war
13 //2017.10.18
14 using namespace std;
15 int n;
16 int x;
17 int w;
18 int f[10][1010][40];
19 int ans;
20 void in(int &x)
21 {
22     int y=1;
23     char c=g();x=0;
24     while(c<'0'||c>'9')
25     {
26     if(c=='-')
27     y=-1;
28     c=g();
29     }
30     while(c<='9'&&c>='0')x=x*10+c-'0',c=g();
31     x*=y;
32 }
33 void o(int x)
34 {
35     if(x<0)
36     {
37         p('-');
38         x=-x;
39     }
40     if(x>9)o(x/10);
41     p(x%10+'0');
42 }
43 
44 void zy(int t)
45 {
46         f[1][t][0]++;   
47         for(int left=2;left<=w;left+=2)
48         f[1][t][left]=max(f[1][t-1][left],f[2][t-1][left-1])+1;
49 }
50 
51 void yz(int t)
52 {
53         for(int left=1;left<=w;left+=2)
54         f[2][t][left]=max(f[2][t-1][left],f[1][t-1][left-1])+1;
55 }
56 
57 int main()
58 {
59     in(n),in(w);
60     For(t,1,n)
61     {
62         for(int left=1;left<=w;left+=2)
63         f[2][t][left]=f[2][t-1][left];
64         for(int left=0;left<=w;left+=2)
65         f[1][t][left]=f[1][t-1][left];
66         in(x);
67         if(x==1)
68         zy(t);
69         else
70         yz(t);
71     }
72     for(int i=1;i<=w;i+=2)
73     ans=max(ans,f[2][n][i]);
74     for(int i=0;i<=w;i+=2)
75     ans=max(ans,f[1][n][i]);
76     o(ans);
77      return 0;
78 }
View Code

 

posted @ 2017-10-18 20:49  WeiAR  阅读(211)  评论(0编辑  收藏  举报