poj 2433 Landscaping 贪心
很想知道这个题目有没人用dp做的。因为我一开始想到的就是dp,但是没设计出有效的解法。但是其实这个题目应该还是比较明显的符合贪心的性质的,那么直接贪一下就好了。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn=1e3+9; int a[maxn]; int n,k; int work() { int ans=1e9,front,end; int flag=1; for(int i=1;i<=n;i++) { if(flag&&a[i]>a[i+1]) { int t=flag,s=i; while(t>=1&&a[t]>=a[t-1]) t--; while(s<=n&&a[s]>=a[s+1]) s++; if(t>=1||s<=n) { int sum=0,tmp=max(a[t],a[s]); for(int j=t+1;j<s;j++) if(a[j]>tmp) sum+=a[j]-tmp; if(sum<ans) { ans=sum; front=t+1; end=s-1; } } } if(a[i+1]<a[i]) flag=false; if(a[i+1]>a[i]) flag=i+1; } int tmp=max(a[front-1],a[end+1]); for(int j=front;j<=end;j++) if(a[j]>tmp) a[j]=tmp; return ans; } int main() { // freopen("in.txt","r",stdin); while(scanf("%d %d",&n,&k)!=EOF) { for(int i=1;i<=n;i++) scanf("%d",&a[i]); a[n+1]=0; int sum=0; bool flag=true; for(int i=1;i<=n;i++) { if(flag&&a[i]>a[i+1]) sum++; if(a[i+1]<a[i]) flag=false; if(a[i+1]>a[i]) flag=true; } int ans=0; for(int i=sum;i>k;i--) ans+=work(); cout<<ans<<endl; } return 0; }
补充:软件开发 , C++ ,