POJ 2133

类似于DP一样做,但这题有个大坑,自己看DIS吧。。。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#include <string.h>
#define LL __int64
using namespace std;

const int N=1<<16;
const int inf=1<<30;
int dp[N];
char str[25];
int ans[25];
int num[125],b,n,goal;

int judge(int f,int s){
	int tmp;int c=0;
	for(int k=0;k<b;k++){
		tmp=1<<k;
		if((f&tmp)==(s&tmp))
		c++;
	}
	return c;
}

int main(){
	while(scanf("%d%d",&b,&n)!=EOF){
		scanf("%s",str+1);
		goal=0;
		int len=strlen(str+1);
		for(int i=len;i>=1;i--){
			int t=str[i]-‘0‘;
			goal+=t*(1<<(b-i));
		}
		int tmp=(1<<b)-1;;
		for(int k=1;k<=n;k++){
			scanf("%s",str+1);
			len=strlen(str+1);
			num[k]=0;
			for(int i=len;i>=1;i--){
				int t=str[i]-‘0‘;
				num[k]+=t*(1<<(b-i));
			}
		}
		bool flag=false;
		for(int k=1;k<=n;k++){
			if(num[k]==goal){
				len=0;
				if(goal==0){
					printf("1\n");
					int pos=goal;
					while(b--){
						ans[++len]=pos%2;
						pos>>=1;
					}
					for(int i=len;i>0;i--)
					printf("%d",ans[i]);
					printf("\n");
					flag=true;
					break;
				}
				else if(goal!=0){
					printf("2\n");
					int pos=goal;
					while(b--){
						ans[++len]=pos%2;
						pos>>=1;
					}
					for(int i=len;i>0;i--)
					printf("%d",ans[i]);
					printf("\n");
					flag=true;
					break;
				}
			}
		}
		if(flag) continue;
		for(int k=0;k<=tmp;k++){
			dp[k]=inf;
		}
		for(int i=1;i<=n;i++)
		dp[num[i]]=0;
		for(int i=1;i<=n;i++){
			for(int k=0;k<=tmp;k++){
				dp[k]=min(dp[k],dp[k^num[i]]+1);
			}
		}
		int pos=-1,c=-1,t;
		for(int k=0;k<=tmp;k++){
			if(dp[k]!=inf){
				t=judge(k,goal);
				if(t>c){
					pos=k;
					c=t;
				}
				else if(t==c){
					if(dp[pos]>dp[k])
					pos=k;
				}
			}
		}
		printf("%d\n",dp[pos]);
		len=0;
		while(b--){
			ans[++len]=pos%2;
			pos>>=1;
		}
		for(int i=len;i>0;i--)
		printf("%d",ans[i]);
		printf("\n");
	}
	return 0;
}

  

时间: 2024-11-01 00:34:49

POJ 2133的相关文章

POJ - 3186 Treats for the Cows (区间DP)

题目链接:http://poj.org/problem?id=3186 题意:给定一组序列,取n次,每次可以取序列最前面的数或最后面的数,第n次出来就乘n,然后求和的最大值. 题解:用dp[i][j]表示i~j区间和的最大值,然后根据这个状态可以从删前和删后转移过来,推出状态转移方程: dp[i][j]=max(dp[i+1][j]+value[i]*k,dp[i][j-1]+value[j]*k) 1 #include <iostream> 2 #include <algorithm&

POJ 2533 - Longest Ordered Subsequence(最长上升子序列) 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:http://poj.org/problem?id=2533 Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given numeric sequence (a1, a2, ..., aN) be any sequence (ai1, ai2, ..., aiK)

POJ——T2271 Guardian of Decency

http://poj.org/problem?id=2771 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 5932   Accepted: 2463 Description Frank N. Stein is a very conservative high-school teacher. He wants to take some of his students on an excursion, but he is

POJ——T2446 Chessboard

http://poj.org/problem?id=2446 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 18560   Accepted: 5857 Description Alice and Bob often play games on chessboard. One day, Alice draws a board with size M * N. She wants Bob to use a lot of c

poj 1088 滑雪 DP(dfs的记忆化搜索)

题目地址:http://poj.org/problem?id=1088 题目大意:给你一个m*n的矩阵 如果其中一个点高于另一个点 那么就可以从高点向下滑 直到没有可以下滑的时候 就得到一条下滑路径 求最大的下滑路径 分析:因为只能从高峰滑到低峰,无后效性,所以每个点都可以找到自己的最长下滑距离(只与自己高度有关).记忆每个点的最长下滑距离,当有另一个点的下滑路径遇到这个点的时候,直接加上这个点的最长下滑距离. dp递推式是,dp[x][y] = max(dp[x][y],dp[x+1][y]+

POJ 1385 计算几何 多边形重心

链接: http://poj.org/problem?id=1385 题意: 给你一个多边形,求它的重心 题解: 模板题,但是不知道为啥我的结果输出的确是-0.00 -0.00 所以我又写了个 if (ans.x == 0) ans.x = 0 感觉好傻逼 代码: 1 #include <map> 2 #include <set> 3 #include <cmath> 4 #include <queue> 5 #include <stack> 6

POJ 1741 Tree(树的点分治,入门题)

Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 21357   Accepted: 7006 Description Give a tree with n vertices,each edge has a length(positive integer less than 1001).Define dist(u,v)=The min distance between node u and v.Give an in

poj 1655 树的重心

Balancing Act Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13178   Accepted: 5565 Description Consider a tree T with N (1 <= N <= 20,000) nodes numbered 1...N. Deleting any node from the tree yields a forest: a collection of one or m

POJ 2479 Maximum sum

http://poj.org/problem?id=2479 题意: 给出一个整数串,求连续子串1和连续子串2,不相交并且串1加串2的和最大. 思路: 其实就是求最大连续和,题意要求就是求两段最大连续和.我们可以从左边和右边分别求最大连续和,代码中的dp_l[i]就是1~i的最大连续和,dp_r[i]则是i~n的最大连续和. 1 #include<iostream> 2 #include<string> 3 #include<cstring> 4 #include<