PKU1160 & HDU3305
PKU1160
#include<iostream>
#include<algorithm>
using namespace std;
int x[320];
int dp[320][32];
int f[320][320];
int s[320][320];
int main()
{
int i,j,k;
int v,p;
scanf("%d%d",&v,&p);
for(i=1;i<=v;++i)
scanf("%d",&x[i]);
for(i=1;i<=v;++i)
{
for(j=i+1;j<=v;++j)
{
f[i][j]=0;
int s=(i+j)/2;
for(k=i;k<=j;++k)
f[i][j]+=abs(x[s]-x[k]);
}
}
memset(dp,-1,sizeof(dp));
for(i=1;i<=v;++i)
{
dp[i][1]=f[1][i];
s[i][1]=1;
}
for(j=2;j<=p;++j)
{
for(k=s[v][j-1];k<v;++k)
{
if(dp[v][j]==-1||dp[k][j-1]+f[k+1][v]<dp[v][j])
{
dp[v][j]=dp[k][j-1]+f[k+1][v];
s[v][j]=k;
}
}
for(i=v-1;i>0;--i)
{
for(k=s[i][j-1];k<=s[i+1][j];++k)
if(dp[i][j]==-1||dp[k][j-1]+f[k+1][i]<dp[i][j])
{
dp[i][j]=dp[k][j-1]+f[k+1][i];
s[i][j]=k;
}
}
}
printf("%d\n",dp[v][p]);
return 0;
}
#include<algorithm>
using namespace std;
int x[320];
int dp[320][32];
int f[320][320];
int s[320][320];
int main()
{
int i,j,k;
int v,p;
scanf("%d%d",&v,&p);
for(i=1;i<=v;++i)
scanf("%d",&x[i]);
for(i=1;i<=v;++i)
{
for(j=i+1;j<=v;++j)
{
f[i][j]=0;
int s=(i+j)/2;
for(k=i;k<=j;++k)
f[i][j]+=abs(x[s]-x[k]);
}
}
memset(dp,-1,sizeof(dp));
for(i=1;i<=v;++i)
{
dp[i][1]=f[1][i];
s[i][1]=1;
}
for(j=2;j<=p;++j)
{
for(k=s[v][j-1];k<v;++k)
{
if(dp[v][j]==-1||dp[k][j-1]+f[k+1][v]<dp[v][j])
{
dp[v][j]=dp[k][j-1]+f[k+1][v];
s[v][j]=k;
}
}
for(i=v-1;i>0;--i)
{
for(k=s[i][j-1];k<=s[i+1][j];++k)
if(dp[i][j]==-1||dp[k][j-1]+f[k+1][i]<dp[i][j])
{
dp[i][j]=dp[k][j-1]+f[k+1][i];
s[i][j]=k;
}
}
}
printf("%d\n",dp[v][p]);
return 0;
}
HDU3305
#include<iostream>
using namespace std;
const int MAX=1245;
int a[MAX];
long long sqr[MAX];
long long sum[MAX];
long long dp[MAX][MAX];
int s[MAX][MAX];
long long val(int i,int j)
{
return ((sum[j]-sum[i-1])*(sum[j]-sum[i-1])-(sqr[j]-sqr[i-1]))/2;
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m),n||m)
{
++m;
sqr[0]=0;sum[0]=0;
for(int i=1;i<=n;++i)
{
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
sqr[i]=sqr[i-1]+a[i]*a[i];
}
for(int i=1;i<=n;++i)
{
dp[i][1]=val(1,i);
s[i][1]=1;
}
for(int i=2;i<=m;++i)
{
dp[n][i]=-1;
for(int k=s[n][i-1];k<n;++k)
{
if(dp[n][i]==-1||dp[k][i-1]+val(k+1,n)<dp[n][i])
{
dp[n][i]=dp[k][i-1]+val(k+1,n);
s[n][i]=k;
}
}
for(int j=n-1;j>0;--j)
{
dp[j][i]=-1;
for(int k=s[j][i-1];k<=s[j+1][i];++k)
{
if(dp[j][i]==-1||dp[k][i-1]+val(k+1,j)<dp[j][i])
{
dp[j][i]=dp[k][i-1]+val(k+1,j);
s[j][i]=k;
}
}
}
}
printf("%lld\n",dp[n][m]);
}
return 0;
}
using namespace std;
const int MAX=1245;
int a[MAX];
long long sqr[MAX];
long long sum[MAX];
long long dp[MAX][MAX];
int s[MAX][MAX];
long long val(int i,int j)
{
return ((sum[j]-sum[i-1])*(sum[j]-sum[i-1])-(sqr[j]-sqr[i-1]))/2;
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m),n||m)
{
++m;
sqr[0]=0;sum[0]=0;
for(int i=1;i<=n;++i)
{
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
sqr[i]=sqr[i-1]+a[i]*a[i];
}
for(int i=1;i<=n;++i)
{
dp[i][1]=val(1,i);
s[i][1]=1;
}
for(int i=2;i<=m;++i)
{
dp[n][i]=-1;
for(int k=s[n][i-1];k<n;++k)
{
if(dp[n][i]==-1||dp[k][i-1]+val(k+1,n)<dp[n][i])
{
dp[n][i]=dp[k][i-1]+val(k+1,n);
s[n][i]=k;
}
}
for(int j=n-1;j>0;--j)
{
dp[j][i]=-1;
for(int k=s[j][i-1];k<=s[j+1][i];++k)
{
if(dp[j][i]==-1||dp[k][i-1]+val(k+1,j)<dp[j][i])
{
dp[j][i]=dp[k][i-1]+val(k+1,j);
s[j][i]=k;
}
}
}
}
printf("%lld\n",dp[n][m]);
}
return 0;
}