[luoguP1437] [HNOI2004]敲砖块(DP)

传送门

可以得到一个性质,如果打掉第i列的第j个,那么第i列的1~j-1个也会打掉。

如果第i列打j个,那么第i+1列至少打j-1个。

#include <cstdio>
#include <cstring>
#define N 71
#define max(x, y) ((x) > (y) ? (x) : (y))

int n, m;
int sum[N][N], f[N][N][N * N];
//sum[i][j]表示第i列前j个的和 
//f[i][j][k]表示前i列,第i列选j个,总共选k个的最优解 

int main()
{
    int i, j, k, l, x;
    scanf("%d %d", &n, &m);
    for(i = 1; i <= n; i++)
        for(j = 1; j <= n - i + 1; j++)
        {
            scanf("%d", &x);
            sum[j][i] = sum[j][i - 1] + x;
        }
    for(i = 0; i < n; i++)
        for(j = 0; j <= n - i + 1; j++)
            for(l = max(j - 1, 0); l <= n - i; l++)
                for(k = j + l; k <= m; k++)
                    f[i + 1][l][k] = max(f[i + 1][l][k], f[i][j][k - l] + sum[i + 1][l]);
    printf("%d
", max(f[n][0][m], f[n][1][m]));
    return 0;
}

  

原文地址:https://www.cnblogs.com/zhenghaotian/p/7412401.html