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 }