codeforces Walking in the Rain (dp 水题 线性 dp)

http://codeforces.com/problemset/problem/192/B

题意: 有  n 个地板 ,你可以 从  i  跳到 i +1  也可以 跳到 i + 2  ,我们的任务是 从  i 跳到  n   下雨了 ,每个 地板 有 能够 坚持的 天数  a[i] ,

      求最多 多少天以后 我们 还可以 跳到  n 地板 。

 

题解:   dp   .

       看到跳到  n  点的 有 两个点  n-1点  和 n - 2点 所以 我们 用 dp[i]  表示最长 dp[i]天 后 一样 能够  跳到  第 i 个点;

        dp[i] = min(max(dp[i - 1],dp[i - 1]) ,a[i]) ;

   

 

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<set>
 7 #include<map>
 8 #include<queue>
 9 #include<vector>
10 #include<string>
11 #define Min(a,b) a<b?a:b
12 #define Max(a,b) a>b?a:b
13 #define CL(a,num) memset(a,num,sizeof(a));
14 #define maxn  1100
15 #define eps  1e-6
16 #define inf 9999999
17 #define read() freopen("data.in","r",stdin) ;
18 using namespace std;
19 int a[maxn] ;
20 int  dp[maxn] ;
21 int main()
22 {
23     int n , m ;
24     int ans ,i,j;
25      //read() ;
26     while(scanf("%d",&n) != EOF)
27     {
28          for( i =  0 ; i < n;i++)
29          {
30              scanf("%d",&a[i]) ;
31          }
32 
33          for(i = 0 ; i < n;i++) dp[i] = a[i] ;
34          dp[1] = min(a[0],a[1]) ;
35          for(i = 2 ; i < n;i++)
36          {
37              dp[i] = min(max(dp[i - 1],dp[i - 2]),a[i]) ;
38 
39          }
40          printf("%d\n",dp[n - 1]) ;
41     }
42 }
posted @ 2012-10-26 22:13  Szz  阅读(245)  评论(0编辑  收藏  举报