题目描述:

小Q刷题计划在m天刷n题,每题有个难度值,定义难度为每天刷的题最大难度值与最小难度值差的平方,整个计划的

难度为每一天难度的总和。小Q可以按照任意顺序刷题,一天可以刷多道,每题只做一次,求总难度最小值。

分析与思路:

首先将所有的题目从大到小排序,以方便我们在后面算出难度值差。

由题目定义每一天难度值为d[i]
枚举每一天以及当这一天做到第k道题时的最小图片说明 。要得到最小图片说明就要枚举每天做的题的最小难度值。

由此可得状态转移方程为dp[i][k]=min(dp[i][k],dp[i-1][j-1]+(a[k]-a[j])*(a[k]-a[j]));

AC代码如下:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=600;
ll a[N],dp[N][N];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,m;
        cin>>n>>m;
        for(int i=1;i<=n;i++)cin>>a[i];
        memset(dp,0x3f3f3f3f,sizeof(dp));
        dp[0][0]=0;
        sort(a+1,a+1+n);
        for(int i=1;i<=m;i++)
            for(int j=1;j<=n;j++)
                for(int k=j;k<=n;k++)
                    dp[i][k]=min(dp[i][k],dp[i-1][j-1]+(a[k]-a[j])*(a[k]-a[j]));
        printf("%lld\n",dp[m][n]);
    }
    return 0;
}