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\n%lld\n", ans);
        else puts("NO");
    }
    return 0;
}
posted @ 2018-09-24 19:09  gaawing  阅读(159)  评论(0编辑  收藏  举报