zoukankan      html  css  js  c++  java
  • 51nod 1636 教育改革

    题目链接

    令f[i][j][k]为第i天选择的课程为j,设置作业为a[j]+k时的最大作业量.

    那么f[i][j][k]可以由哪些状态转移而来?先把课程按复杂度排序,那么可以转移来的课程是f[i-1][t][r],

    其中t是<j,且复杂度a[t].c严格小于a[j].c. 这是前提条件, 其次, 对于a[t]布置的作业数量r,根据题意需要满足作业j布置的作业(a[j]+k) % r == 0,或者是 (a[j]+k) - K = r. 在这些状态转移中取最值即可.

    需要留意的地方:因为bi-ai<=100,也就是说布置的作业量的状态属于[ai,bi],所以我们用差值来记录布置了多少作业,没必要朴素的真的去记录布置作业量,因为ai<=10^16..太大了.

    其次,要用long long, 各个地方都别漏了. 再其次,转移的时候,需要上一个状态合法,即上一个状态的值非0.

    
    #include<bits/stdc++.h>
    using namespace std;
    
    #define ll long long
    #define FOR(i,a,b) for(int i=(a);i<=(b);++i)
    
    ll N, M, K, cas;
    struct node{ll l, r, c;} a[55];
    bool cmp(node a, node b) {return a.c < b.c;}
    bool ok(ll v, node nd) {return nd.l <= v && v <= nd.r;}
    ll f[55][55][105], ans;
    
    int main () {
        while (~scanf("%lld%lld%lld", &N, &M, &K)) {
            ans = 0;
            memset(f, 0, sizeof f);
            FOR(i, 1, M) scanf("%lld%lld%lld", &a[i].l, &a[i].r, &a[i].c);
            sort(a + 1, a + 1 + M, cmp);
            FOR(i, 1, M)
                FOR(j, 0, a[i].r - a[i].l)
                    f[1][i][j] = a[i].l + j;
    
            FOR(i, 2, N) {
                FOR(j, 2, M) {
                    FOR(t, 1, j - 1) {
                        if (a[j].c <= a[t].c) continue;
                        FOR(k, 0, a[j].r - a[j].l) {
                            ll pre = a[j].l + k - K;
                            ll &cur = f[i][j][k];
                            if (ok(pre, a[t]) && f[i - 1][t][pre - a[t].l])
                               cur = max(cur, f[i - 1][t][pre - a[t].l] + a[j].l + k);
                            pre = (a[j].l + k) / K;
                            if ((a[j].l + k) % K == 0 && ok(pre, a[t])
                                    && f[i - 1][t][pre - a[t].l])
                               cur = max(cur, f[i - 1][t][pre - a[t].l]
                                       + a[j].l + k);
                        } 
                    }
                }
            }
            FOR(i, 1, M)
                FOR(j, 0, a[i].r - a[i].l)
                    ans = max(ans, f[N][i][j]);
            if (ans) printf("YES
    %lld
    ", ans);
            else puts("NO");
        }
        return 0;
    }
    
  • 相关阅读:
    poj 2728 Desert King
    uva 439 Knight Moves
    hdu 1875 畅通工程再续
    scau实验题 8600 骑士周游问题(有障碍物)
    scau实验题 8596 Longest Ordered Subsequence
    poj 1679 The Unique MST
    uva 527 Oil Deposits
    poj 2533 Longest Ordered Subsequence
    .net 程序员 java 开发入门
    Collation conflict occur at operation on User define funtion & table's column
  • 原文地址:https://www.cnblogs.com/Rosebud/p/9696263.html
Copyright © 2011-2022 走看看