购物(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;
}

 

posted @ 2022-03-07 23:01  std&ice  阅读(57)  评论(0编辑  收藏  举报