为什么这样不行
#include<bits/stdc++.h>
using namespace std;
int n,m;
long long int w[600],sum[600],f[600][600],end[600][600],kl[600][600];
long long int read()
{
long long int x=0,t=1;
char ch=getchar();
while (!isdigit(ch))
{
if (ch=='-')
t=-1;
ch=getchar();
}
while (isdigit(ch))
{
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
return x*t;
}
int main()
{
n=read();
m=read();
for (int i=1;i<=n;++i)
for (int j=2;j<=m;++j)
f[i][j]=1000000;
for (int i=2;i<=n;++i)
{
w[i]=read();
sum[i]=sum[i-1]+w[i];
f[1][1]+=sum[i];
}
end[1][1]=1;
for (int i=2;i<=n;++i)
{
long long int i1=f[i-1][1],i2=f[i-1][1]-(n-2*i+2)*w[i];
if (i1<i2)
{
f[i][1]=i1;
end[i][1]=end[i-1][1];
}
else
{
f[i][1]=i2;
end[i][1]=i;
}
}
for (int i=2;i<=n;++i)
{
for (int j=2;j<=min(i,m);++j)
{
for (int h=j-1;h<i;++h)
{
long long int last=end[h][j-1];
long long int f1=f[h][j],f2=f[h][j-1]-(sum[i]-sum[last])*(n-i+1),kll=0;
if (kl[last][i])
kll=kl[last][i];
else
for (int k=last+1;k<i;++k)
{
long long int w1=sum[k]-sum[last],w2=sum[i]-sum[k];
if (w1>w2)
kll+=w1-w2;
}
f2-=kll;
if (!kl[last][i])
kl[last][i]=kll;
if (f1<f2&&f1<f[i][j])
{
f[i][j]=f1;
end[i][j]=end[h][j];
}
else if (f1>=f2&&f2<f[i][j])
{
f[i][j]=f2;
end[i][j]=i;
}
//cout<<i<<" "<<j<<" "<<f[i][j]<<" "<<end[i][j]<<endl;
}
}
}
cout<<f[n][m];
}
这样又可以
#include<bits/stdc++.h>
using namespace std;
int n,m;
long long int w[600],sum[600],f[600][600],end[600][600],kl[600][600];
long long int read()
{
long long int x=0,t=1;
char ch=getchar();
while (!isdigit(ch))
{
if (ch=='-')
t=-1;
ch=getchar();
}
while (isdigit(ch))
{
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
return x*t;
}
int main()
{
n=read();
m=read();
for (int i=1;i<=n;++i)
for (int j=2;j<=m;++j)
f[i][j]=10000000;
for (int i=2;i<=n;++i)
{
w[i]=read();
sum[i]=sum[i-1]+w[i];
f[1][1]+=sum[i];
}
end[1][1]=1;
for (int i=2;i<=n;++i)
{
long long int i1=f[i-1][1],i2=f[i-1][1]-(n-2*i+2)*w[i];
if (i1<i2)
{
f[i][1]=i1;
end[i][1]=end[i-1][1];
}
else
{
f[i][1]=i2;
end[i][1]=i;
}
}
for (int i=2;i<=n;++i)
{
for (int j=2;j<=min(i,m);++j)
{
for (int h=j-1;h<i;++h)
{
long long int last=end[h][j-1];
long long int f1=f[h][j],f2=f[h][j-1]-(sum[i]-sum[last])*(n-i+1),kll=0;
if (kl[last][i])
kll=kl[last][i];
else
for (int k=last+1;k<i;++k)
{
long long int w1=sum[k]-sum[last],w2=sum[i]-sum[k];
if (w1>w2)
kll+=w1-w2;
}
f2-=kll;
if (!kl[last][i])
kl[last][i]=kll;
if (f1<f2&&f1<f[i][j])
{
f[i][j]=f1;
end[i][j]=end[h][j];
}
else if (f1>=f2&&f2<f[i][j])
{
f[i][j]=f2;
end[i][j]=i;
}
//cout<<i<<" "<<j<<" "<<f[i][j]<<" "<<end[i][j]<<endl;
}
}
}
cout<<f[n][m];
}
没觉得有什么差别呀