题目描述:
小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;
}
京公网安备 11010502036488号