【题解】BZOJ 2748 [HAOI2012]音量调节

D e s c r i p t i o n

传送门

给定一个初始值 a 0 以及每次可以上调或下调的量 c i 和最大数值 m a x ,求出在满足 i < n , 0 a i m a x 条件下的 m a x { a i }

S o l u t i o n

入门级别的DP吧。

我们可以令 d ( i , j ) 表示第 i 个时刻,是否可能达到 j 的音量。

状态转移方程很好写: d ( i , j ) = d ( i 1 , j c i ) \or d ( i 1 , j + c [ i ] )

C o d e

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 55
#define MAXLEVEL 1005
int c[MAXN];
bool d[MAXN][MAXLEVEL];
int main() {
    int n, beginlevel, maxlevel;
    scanf("%d%d%d", &n, &beginlevel, &maxlevel);
    for (int i = 1; i <= n; i++)
        scanf("%d", &c[i]);
    d[0][beginlevel] = true;
    for (int i = 1; i <= n; i++)
        for (int j = 0; j <= maxlevel; j++) {
            if (j - c[i] >= 0)  
                d[i][j] |= d[i - 1][j - c[i]];
            if (j + c[i] <= maxlevel) 
                d[i][j] |= d[i - 1][j + c[i]]; 
        }
    for (int i = maxlevel; i >= 0; i--)
        if (d[n][i]) {
            printf("%d\n", i);
            return 0;
        }
    printf("-1\n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Diogenes_/article/details/81029349