Codeforces 545 C Woodcutters(贪心/DP)

来源:互联网 发布:win7电脑连接网络 编辑:程序博客网 时间:2024/05/01 22:35

题目链接:
Codeforces 545 C Woodcutters
题意:
有n棵树,每棵树都有位置坐标xi和高度hi,每棵树可以向左砍倒或者向右砍倒,也可以不砍,但是砍倒不能重复占用位置,每棵树本身占一个位置,问最多能砍多少棵树?

/**************DP Solution**************/#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#include <climits>using namespace std;const int maxn=100010;int n,x[maxn],h[maxn],dp[maxn][3];int main(){    //freopen("in.txt","r",stdin);    while(~scanf("%d",&n)){        for(int i=1;i<=n;i++){            scanf("%d%d",&x[i],&h[i]);        }        if(n<=2){            printf("%d\n",n);            continue;        }        x[n+1]=INT_MAX;        memset(dp,0,sizeof(dp));        dp[1][0]=0;        dp[1][1]=1;        if(x[1]+h[1]<x[2]) dp[1][2]=1;        for(int i=2;i<=n;i++){            //ith tree stay at position            dp[i][0]=max(dp[i-1][0],max(dp[i-1][1],dp[i-1][2]));            //cut ith to left, must             if(x[i]-h[i]>x[i-1]) dp[i][1]=max(dp[i][1],max(dp[i-1][0],dp[i-1][1])+1);            if(x[i]-h[i]>x[i-1]+h[i-1]) dp[i][1]=max(dp[i][1],dp[i-1][2]+1);            //cut ith tree to right, must            if(x[i]+h[i]<x[i+1]){                dp[i][2]=max(dp[i-1][0],max(dp[i-1][1],dp[i-1][2]))+1;            }        }        int ans=max(dp[n][0],max(dp[n][1],dp[n][2]));        printf("%d\n",ans);    }    return 0;}
/*********Greedy Solution**********///46MS 2800K#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#include <climits>using namespace std;const int maxn=100010;int n,x[maxn],h[maxn];int main(){    while(~scanf("%d",&n)){        for(int i=1;i<=n;i++){            scanf("%d%d",&x[i],&h[i]);        }                if(n<=2){            printf("%d\n",n);            continue;        }        int ans=2;        for(int i=2;i<n;i++){            if(x[i]-h[i]>x[i-1]){                ans++;            }else if(x[i]+h[i]<x[i+1]){                ans++;                x[i]+=h[i];            }        }        printf("%d\n",ans);    }    return 0;}
0 0
原创粉丝点击