DP解Stringsobits

Stringsobits

Kim Schrijvers

Consider an ordered set S of strings of N (1 <= N <= 31)bits. Bits, of course, are either 0 or 1.

This set of strings is interesting because it is ordered andcontains all possible strings of length N that have L (1 <= L<= N) or fewer bits that are `1‘.

Your task is to read a number I (1 <= I <= sizeof(S))from the input and print the Ith element of the ordered set for Nbits with no more than L bits that are `1‘.

PROGRAM NAME: kimbits

INPUT FORMAT

A single line with three space separated integers: N, L, and I.

SAMPLE INPUT (file kimbits.in)

5 3 19

OUTPUT FORMAT

A single line containing the integer that represents the Ith elementfrom the order set, as described.

SAMPLE OUTPUT (file kimbits.out)

10011

分析

分3步进行

1.c[i][j]为位数为i,含有1的个数为j的二进制数的个数。其实c[i][j]就是组合数,这个数组就是杨辉三角。初始化后迭代求解这个数组。

2.c[i][j]现在为位数为i,含有1的个数小于等于j的二进制数的个数。叠加。

3.求解第I小的二进制数:从高到低依次求出每一位

总结:题目中的“第I大”应该是第I小,另外注意I值用int越界问题,用unsigned int即可。

通过代码

/*
ID: c1033311
LANG: C++
TASK: kimbits
*/
#include<stdio.h>

int main(){
	FILE *fin=fopen("kimbits.in","r");
	FILE *fout=fopen("kimbits.out","w");

	unsigned int N,L,I;
	unsigned int c[32][32]; //c[i][j]为位数为i,含有1的个数为j的二进制数的个数
	unsigned int i,j;

	fscanf(fin,"%u%u%u",&N,&L,&I);

	//初始化c[i][j]
	for(i=0;i<=N;++i)
	{
		c[i][0]=1;  //全0
		c[i][i]=1;	//全1
	}

	//迭代求解c[i][j]
	for(i=2;i<=N;++i)
		for(j=1;j<=L&&j<i;++j)
			c[i][j]=c[i-1][j]+c[i-1][j-1];

	//c[i][j]现在为位数为i,含有1的个数小于等于j的二进制数的个数
	for(i=1;i<=N;++i)
		for(j=1;j<=L&&j<=i;++j)
			c[i][j]+=c[i][j-1];

	//求解第I小的二进制数:从高到低依次求出每一位

	unsigned int sum=0; //目前为止满足要求的二进制数个数
	unsigned int n1=0; //目前为止用掉1的个数

	for(i=1;i<=N;++i)
	{
		unsigned int tmp=L-n1;
		if(tmp>N-i)
			tmp=N-i;

		if(c[N-i][tmp]+sum==I-1)
		{
			fprintf(fout,"1");
			for(j=i+1;j<=N;++j)
				fprintf(fout,"0");
			break;
		}
		else if(c[N-i][tmp]+sum<I-1)
		{
			fprintf(fout,"1");
			sum+=c[N-i][tmp];
			n1++;
		}
		else
			fprintf(fout,"0");
	}

	fprintf(fout,"\n");

	return 0;
}
时间: 2024-12-28 15:30:03

DP解Stringsobits的相关文章

dp解Codeforces Round #260 (Div. 2)C. Boredom

#include<iostream> #include<map> #include<string> #include<cstring> #include<cstdio> #include<cstdlib> #include<cmath> #include<queue> #include<vector> #include<algorithm> using namespace std; lo

DP解LCS问题模板及其优化

LCS--Longest Common Subsequence,即最长公共子序列,一般使用DP来解. 常规方法: dp[i][j]表示字符串s1前i个字符组成的字符串与s2前j个字符组成的字符串的LCS的长度,则当s1[i-1]==s2[j-1]时,dp[i][j]=dp[i-1][j-1],否则dp[i][j]=max(dp[i-1][j],dp[i][j-1]). 最终的dp[len1][len2]即最终答案.代码如下: 1 #include<cstdio> 2 #include<c

poj3252Round Numbers非递归数位dp解

Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9894   Accepted: 3569 Description The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, Paper, Stone' (also known as 'Rock, Paper, Scissors', 'Ro, Sham, Bo'

poj 2688 状态压缩dp解tsp

题意: 裸的tsp. 分析: 用bfs求出任意两点之间的距离后可以暴搜也可以用next_permutation水,但效率肯定不如状压dp.dp[s][u]表示从0出发访问过s集合中的点,目前在点u走过的最短路程. 代码: //poj 2688 //sep9 #include <iostream> #include <queue> using namespace std; const int maxW=32; const int maxN=12; int dx[4]={-1,1,0,

hdu 2154 跳舞毯(简单DP)

题意: 有一个圆圆的毯,被平均分成三个扇形.分为标记为A,B,C. 小余从A开始跳,每次可跳到相邻的扇形上.(A->B 或 A->C) 问小余跳n次,最后回到扇形A的方案数是多少. 思路: A,B,C是三个状态.我们画一棵生长的树,一层一层下来,然后发现每一层上其实最多就只有三种状态.所以明显是可以用DP解喽 直接看代码., 代码: int main(){ int n; int f[1005][5]; while(cin>>n,n){ f[0][0]=1; f[0][1]=0; f

dp新手入门

网址转载链接:  http://bbs.chinaunix.net/thread-4094539-1-1.html 动态规划:从新手到专家 Hawstein翻译 前言 我们遇到的问题中,有很大一部分可以用动态规划(简称DP)来解. 解决这类问题可以很大地提升你的能力与技巧,我会试着帮助你理解如何使用DP来解题. 这篇文章是基于实例展开来讲的,因为干巴巴的理论实在不好理解. 注意:如果你对于其中某一节已经了解并且不想阅读它,没关系,直接跳过它即可. 简介(入门) 什么是动态规划,我们要如何描述它?

2014百度之星资格赛 1004:Labyrinth(DP)

Labyrinth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1507    Accepted Submission(s): 520 Problem Description 度度熊是一只喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫只能从矩阵左上角第一个方格开始走,只有走到右上角的第一个格子才算走出迷宫,每一次只能走一格,

hdoj1561The more, The Better(树形dp,依赖背包)

题目:hdoj1561The more, The Better 题意:ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物.但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡.你能帮ACboy算出要获得尽量多的宝物应该攻克哪M个城堡吗? 分析: 分类:树形dp入门,依赖背包 做这题前又看了一遍背包9讲,感觉太经典了,尤其是泛化背包,简直是精华.这题的关系就是裸地依赖背包,用树形

acdream 小晴天老师系列——苹果大丰收(DP)

小晴天老师系列——苹果大丰收 Problem Description 小晴天的后花园有好多好多的苹果树,某天,苹果大丰收~小晴天总共摘了M个苹果,我们假设苹果之间是不可分辨的. 为了保存苹果,小晴天买了N个一模一样的箱子,想要把苹果放进去,允许有的箱子是空的,请问小晴天有多少种不同的放法呢? 例如对于4个苹果,3个箱子,2+1+1和1+2+1和1+1+2 是同一种分法. Input 多组数据,首先是一个正整数t(t<=100)表示数据的组数. 每组数据均包含二个整数M和N(1<=M,N<