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 }
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 }