【动态规划】[luoguP1868]饥饿的奶牛

题目

一开始又没用读懂题
DP题 dp[i]表示牛走到i这个位置能吃到的最大草数 最后ans找最大值
关键找最右的端点 然后从0一直找过去(为什么从0找我也不知道 一开始从1找wa了一个大点 从0找就ac了)

代码如下



#include
#include
#include
#include

    using namespace std;
    #define in = read();
    typedef long long ll;
    typedef unsigned int ui;
    const ll size = 5000000 + 10000;

        struct data{    ll x , y;}a[size];

            int n;
            ll rightpoint , j = 1 , ans;
            ll f[size];

inline ll read(){
        ll num = 0 , f = 1;    char ch = getchar();

        while(!isdigit(ch)){
                if(ch == '-')   f = -1;
                ch = getchar();
        }
        while(isdigit(ch)){
                num = num*10 + ch - '0';
                ch = getchar();
        }

        return num*f;
}

inline bool cmp(data a , data b){
        return a.x != b.x ? a.x < b.x : a.y < b.y;
}

int main(){
        n in;
        for(register int i=1;i<=n;i++){
                a[i].x in;  a[i].y in;
                rightpoint = max(rightpoint , a[i].y);
        }

        sort(a + 1 , a + n + 1 , cmp);
        for(register int i=0;i<=rightpoint;i++){
                f[i] = max(f[i] , f[i - 1]);
                while(a[j].x == i && j <= n){
                        f[a[j].y] = max(f[a[j].y] , f[a[j].x - 1] + a[j].y - a[j].x + 1);
                        j ++;
                }
                ans = max(ans , f[i]);
        }

        printf("%lld" , ans);
}


//COYG

你可能感兴趣的:(动态规划)