[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\n", max(f[n][0][m], f[n][1][m]));
return 0;
}

浙公网安备 33010602011771号