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

Description D e s c r i p t i o n

传送门

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

Solution S o l u t i o n

入门级别的DP吧。

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

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

Code C o d e

#include
#include
#include
#include
#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;
}

你可能感兴趣的:(DP,BZOJ)