求助。。本人dpij表示的是前i个骨牌,翻转j次的最小差
查看原帖
求助。。本人dpij表示的是前i个骨牌,翻转j次的最小差
272314
Autonomier楼主2020/10/4 16:45

然而只有72分

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
inline int read(){
    int s=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
    return s*w;
}
int n;
int a[1001],b[1001];
int dp[1001][1001];
int main()
{
	memset(dp,128,sizeof(dp));
	n=read();
	for(int i=1;i<=n;i++)
	{
		a[i]=read();
		b[i]=read();
	}
	int s1=0,s2=0;
	for(int i=1;i<=n;i++)
	{
		s1+=a[i],s2+=b[i];
		dp[i][0]=s1-s2;
	}
	dp[1][1]=b[1]-a[1];
	for(int i=2;i<=n;i++)
	{
		for(int j=1;j<=i;j++)
		{
			if(abs(dp[i-1][j]+a[i]-b[i])<=abs(dp[i-1][j-1]+b[i]-a[i]))
				dp[i][j]=dp[i-1][j]+a[i]-b[i];
			else
				dp[i][j]=dp[i-1][j-1]+b[i]-a[i];
		}
	}
	int res=0,min=0x3f3f3f3f;
	for(int i=0;i<=n;i++)
	{
		if(abs(dp[n][i])<abs(min))
		{
			res=i;
			min=dp[n][i];
		}
	}
	
		printf("%d\n",res);
	return 0;
}
2020/10/4 16:45
加载中...