這題我一看就想到了DP,然後也按著DP做了,然後一次就AC了
但是,我從網上找了下別人的思路,又有種想哭的感覺
別人只是找到最小的算一下平方差,就過了,仔細考慮了一下,也對
兩個數的平方差>與中間任意幾個數的平方差的和
在此我是不是應該反思一下,我的DP代碼是否是真的對了呢
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
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<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
ans=(100-a[0])*(100-a[0]);
printf("%d\n",ans);
}
return 0;
}
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
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;
}