codeforces C. Painting Fence

http://codeforces.com/contest/448/problem/C

题意:给你n宽度为1,高度为ai的木板,然后用刷子刷颜色,可以横着刷、刷着刷,问最少刷多少次可以全部刷上颜色。

思路:dp[i][j] 表示在第i列以后的木板都已刷完且第j列的木板是横着刷的,最少需要的次数。如果a[i]>=a[j]的情况,比较再竖着刷一次和横着刷哪一个情况次数少。

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <algorithm>
 5 #define maxn 1000100
 6 #define ll long long
 7 using namespace std;
 8 const int inf=1<<30;
 9 
10 int n;
11 ll a[maxn];
12 ll dp[5001][5001];
13 
14 int main()
15 {
16     scanf("%d",&n);
17     for(int i=1; i<=n; i++)
18     {
19         cin>>a[i];
20     }
21     a[0]=0;
22     for(int i=0; i<=n; i++)
23     {
24         dp[n][i]=0;
25     }
26     for(int i=n; i>=1; i--)
27     {
28        for(int j=0; j<=n; j++)
29        {
30            if(a[j]>=a[i])
31            {
32                dp[i-1][j]=dp[i][i];
33            }
34            else dp[i-1][j]=min(dp[i][j]+1,dp[i][i]+a[i]-a[j]);
35        }
36     }
37     cout<<dp[0][0]<<endl;
38     return 0;
39 }
View Code

 

posted @ 2015-03-13 10:57  null1019  阅读(211)  评论(0编辑  收藏  举报