一点疑惑
查看原帖
一点疑惑
219298
later,when楼主2020/9/9 13:26

为什么这样不行

#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];		
} 

没觉得有什么差别呀

2020/9/9 13:26
加载中...