站外dp题求调 悬关
  • 板块学术版
  • 楼主Dream__Sky
  • 当前回复6
  • 已保存回复6
  • 发布时间2023/6/26 19:37
  • 上次更新2023/11/3 12:22:32
查看原帖
站外dp题求调 悬关
554665
Dream__Sky楼主2023/6/26 19:37

题目

#include <bits/stdc++.h>
using namespace std;
int n,m,s,a[101],f[101][100000],ret,daan2;
string bzc;
map<int,int> mp;
int check(string x)
{
	int t=1,sum=0;
	for(int i=x.size()-1;i>=0;i--)
		sum+=(t*int(x[i]-'0')),t*=2;
	return sum;
}
int ss(int x)
{
	int temp=x^s,sum=0;
	while(temp)
	{
		sum++;
		temp=temp&(temp-1);
	}
	return sum; 
}
void print(int x)
{
	int t=0,a[100]={0};
	while(x)
	{
		a[++t]=x%2;
		x/=2;
	}
	if(t<m) for(int i=t+1;i<=m;i++) cout<<0;
	for(int i=t;i>=1;i--) cout<<a[i];
	cout<<endl;
}
signed main()
{
	cin>>m>>n;
	cin>>bzc;
	s=check(bzc);

	for(int i=1;i<=n;i++)  
	{
		string ch;
		cin>>ch;
		a[i]=check(ch);
		mp[a[i]]=1;
	}
	
	memset(f,0x7f,sizeof f); 
	f[0][0]=0;
	
	for(int i=1;i<=n;i++)
		for(int j=0;j<(1<<m);j++)
			f[i][j]=min(f[i-1][j],f[i-1][j^a[i]]+1);
			
		
	int cz=0x3f;
	for(int i=0;i<(1<<m);i++)
	{
		int x=ss(i);
		if(x<cz||(x==cz&&f[n][i]<ret)) cz=x,ret=f[n][i],daan2=i;
	}
	
	cout<<ret-1<<endl;
	print(daan2);
	if(mp[daan2]) cout<<"Yes";
	else cout<<"No";
	return 0;
}

有没有dp大佬能帮我一下,谢谢!

2023/6/26 19:37
加载中...