购物(DP问题)
/**\ https://ac.nowcoder.com/acm/problem/14526 01背包问题变种 \**/ #include <bits/stdc++.h> using namespace std; #define fi first #define se second #define go continue #define int long long #define PII pair<int, int> #define sf(x) scanf("%lld",&x) #define pf(x) printf("%lld\n",x) #define ytz int _; sf(_); while(_--) #define fory(i,a,b) for(int i = a; i <= b; ++i) #define forl(i,a,b) for(int i = a; i >= b; --i) #define debug(a) cout << #a << " = " << a <<endl; const int N = 3e2 + 10; int n, m; int f[N][N], a[N][N]; signed main() { sf(n), sf(m); fory(i, 1, n) { fory(j, 1, m) sf(a[i][j]); sort(a[i] + 1, a[i] + 1 + m); fory(j, 1, m) a[i][j] += a[i][j - 1]; } memset(f, 0x3f, sizeof f); f[0][0] = 0; //f[i][j] 表示第i天,目前到现在买了j个糖果 for(int i = 1; i <= n; ++i) { int len = min(n, i * m); //n = 3 m = 2情况 for(int j = 1; j <= len; ++j) { for(int k = i - 1; k <= j; ++k) { f[i][j] = min(f[i][j], f[i - 1][k] + a[i][j - k] + (j - k) * (j - k)); } } } pf(f[n][n]); return 0; }