当前位置:编程学习 > C/C++ >>

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++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,