没时间打字了,要回家了,Mark一下,下次补齐
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<memory.h>
#include<algorithm>
using namespace std;
int n,k,p[200],f[2000][200];
void init()
{
memset(f,0,sizeof(f));
memset(p,0,sizeof(p));
scanf("%d%d",&n,&k);
for (int i = 1; i <= k; ++ i)
scanf("%d",&p[i]);
sort(p+1,p+1+k);
}
int mmin(int a,int b)
{
if (a == 0)
return b;
else
return min(a,b);
}
int dp(int x,int y,int l)
{
if (x == 1)
{
f[x][y] = p[y];
return f[x][y];
}
if (y == k)
{
f[x][y] = p[y] * x * x + dp(x,1,x-1);
return f[x][y];
}
int temp;
temp = k - y + 1;
if (temp * l < x)
return 0xFFFFFFF;
if (f[x][y] != 0)
return f[x][y];
temp = (x-1) / (temp) + 1;
for (int i = temp; i <= l; ++ i)
{
if (i == 1)
f[x][y] = dp(x-1,y+1,x-2) + p[y];
else
f[x][y] = mmin( f[x][y] , dp(x-i,y+1,x-i-1) + dp(i,1,i-1) + i * i * p[y] );
}
return f[x][y];
}
int main()
{
init();
printf("%d",dp(n,1,n-1));
return 0;
}