这题我一看就想到了DP,然后也按着DP做了,然后一次就AC了
但是,我从网上找了下别人的思路,又有种想哭的感觉
别人只是找到最小的算一下平方差,就过了,仔细考虑了一下,也对
两个数的平方差>与中间任意几个数的平方差的和
在此我是不是应该反思一下,我的DP代码是否是真的对了呢
#include
#include
#include
#include
using namespace std;
int main()
{
int i,cas,n,m,ans;
int a[45];
scanf("%d",&cas);
while(cas--)
{
scanf("%d%d",&n,&m);
for(i=0;i
#include
#include
#include
#include
using namespace std;
bool cmp(const int &a,const int &b)
{
return a>b 1:0;
}
int main()
{
int i,j,cas,n,m,ans;
int dp[45][105],a[45][45],c[45];
scanf("%d",&cas);
while(cas--)
{
scanf("%d%d",&n,&m);
memset(dp,0,sizeof(dp));
memset(a,0,sizeof(a));
for(i=1;i<=n;i++)
scanf("%d",&c[i]);
sort(c+1,c+n+1,cmp);
c[0]=100;
for(i=0;i<=n;i++)
{
for(j=0;j<=i;j++)
{
a[i][j]=(c[i]-c[j])*(c[i]-c[j]);
}
}
// printf("%d %d %d\n",a[1][0],a[2][0],a[0][0]);
ans=0;
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
if(i==1) dp[i][j]=a[j][0];
else
dp[i][j]=max(dp[i][j],dp[i-1][j-1]+a[j][j-1]);
ans=max(ans,dp[i][j]);
}
}
printf("%d\n",ans);
}
return 0;
}