20分求助
查看原帖
20分求助
341864
sgxsz楼主2024/11/19 21:04
#include<bits/stdc++.h>
using namespace std;

inline int read() {
	register int x=0,ch=getchar();
	while(ch<'0'||ch>'9')  ch=getchar();
	while(ch<='9'&&ch>='0'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar();	}
	return x;
}
int a[505],b[505],c[505],d[505],f[505][505];
inline int hj(int x){
	return x>1e9?-1:x;
}
int main()
{
	register int i,j,k,T,n,x,y,z;
	cin>>T;
	while(T--){
		n=read();
		for(i=1;i<=n;i++){
			a[i]=read()&1;
			b[i]=b[i-1]^a[i];
			d[i]=d[i-1]+b[i];
		}
		for(i=1;i<=n;i++)  c[i]=read();
		memset(f,127,sizeof(f));
		f[0][d[n]]=f[1][d[n]]=0;
		
		for(i=2;i<=n;i++){
			for(j=0;j<=n;j++)	f[i][j]=f[i-1][j];
			for(k=1;k<i;k++){
				if(a[i]==a[k])	continue;
				x=(i-k)-2*(d[i-1]-d[k-1]);
				if(x==0)  continue;
				for(j=max(0,-x);j<=min(n,n-x);j++){
					if(f[k-1][j]>1e9)	continue;
					f[i][j+x]=min(f[i][j+x],f[k-1][j]+c[i]+c[k]);
				}
			}
			/*printf("\n%d:",i);
			for(j=0;j<=n;j++)
				printf("%d ",f[i][j]<1e9?f[i][j]:-1);*/
		}
		//cout<<endl;
		for(i=0;i<=n;i++)
			printf("%d ",f[n][i]<1e9?f[n][i]:-1);
		cout<<"\n";
	}
	return 0;
}

样例第三组也没过

2024/11/19 21:04
加载中...