usaco usaco Stringsobits

题意是长度为N的01串,其中1的个数不超过L的,字典序为I的串是什么,输出这个串

第一遍宝搜超时,然后看见别人dp,花了很久才明白dp方程中的边界处理情况,好像是忽然间明白的。

贴个我看懂的链接吧http://blog.csdn.net/kk303/article/details/7068605

/*
ID: modengd1
PROG: kimbits
LANG: C++
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 40

using namespace std;

long long dp[MAXN][MAXN];

int main()
{
    freopen("kimbits.in","r",stdin);
    freopen("kimbits.out","w",stdout);
    long long N,L,I,i,j;
    while(~scanf("%lld%lld%lld",&N,&L,&I))
    {
        memset(dp,0,sizeof(dp));
        for(i=1;i<=N;i++)//边界
            dp[i][0]=1;
        for(i=0;i<=L;i++)//边界
            dp[0][i]=1;
        for(i=1;i<=N;i++)
        {
            for(j=1;j<=L;j++)
            {
                if(j>i)
                    dp[i][j]=dp[i][i];
                else
                    dp[i][j]=dp[i-1][j-1]+dp[i-1][j];
            }
        }
        for(i=N; i>0; i--)
        {
            if (I!=1 && dp[i-1][L]<I)
            {
                cout<<1;
                I-=dp[i-1][L];
                L-=1;
            }
            else cout<<0;
        }
        cout<<endl;
    }
    return 0;
}

  

时间: 2024-08-02 14:52:00

usaco usaco Stringsobits的相关文章

usaco 3.2 Stringsobits 数位dp

StringsobitsKim 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 and contains all possible strings of length N that have L (1 <=

USACO Section 3.2 01串 Stringsobits

题目背景 考虑排好序的N(N<=31)位二进制数. 题目描述 他们是排列好的,而且包含所有长度为N且这个二进制数中1的位数的个数小于等于L(L<=N)的数. 你的任务是输出第i(1<=i<=长度为N的二进制数的个数)小的(注:题目这里表述不清,实际是,从最小的往大的数,数到第i个符合条件的,这个意思),长度为N,且1的位数的个数小于等于L的那个二进制数. (例:100101中,N=6,含有位数为1的个数为3). 输入输出格式 输入格式: 共一行,用空格分开的三个整数N,L,i. 输

USACO Section 3.2 Stringsobits

题目背景 考虑排好序的N(N<=31)位二进制数. 题目描述 他们是排列好的,而且包含所有长度为N且这个二进制数中1的位数的个数小于等于L(L<=N)的数. 你的任务是输出第i(1<=i<=长度为N的二进制数的个数)小的(注:题目这里表述不清,实际是,从最小的往大的数,数到第i个符合条件的,这个意思),长度为N,且1的位数的个数小于等于L的那个二进制数. (例:100101中,N=6,含有位数为1的个数为3). Input 共一行,用空格分开的三个整数N,L,i. Output 共

Section 1.2.3 水模拟

发现神站一枚http://www.wzoi.org/usaco/ usaco的翻译. = =想到学姐之前吐槽CP让她们翻译usaco,再看看这名字= =卧槽果然是我们学校搞的. 真是羡慕中学就能搞信息学之类的同学啊(这里:考不上竞赛班的蒟蒻一枚) http://www.wzoi.org/usaco/13%5C408.asp 翻译如上 大概就是各种旋转变换问是否可实现 有个简化的办法 发现转90度 重复多次就可以搞出180 270 什么的 然后找出旋转(i, j) 会变成(j, n - i + 1

推荐一些信息学奥赛的网站

推荐一些信息学奥赛的网站:OJ类USACO http://ace.delos.com/usacogateVijos http://www.vijos.cn/SGU http://acm.sgu.ru/URAL http://acm.timus.ru/SPOJ http://www.spoj.pl/topcoder http://www.topcoder.com/rqnoj http://www.rqnoj.cn/UVA http://acm.uva.es/p/POI http://www.mim

COGS 696. [IOI1996][USACO 2.3] 最长前缀

★   输入文件:prefix.in   输出文件:prefix.out   简单对比时间限制:1 s   内存限制:128 MB 描述 USACO 2.3.1 IOI96 在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的.生物学家对于把长的序列分解成较短的序列(即元素)很感兴趣. 如果一个集合 P 中的元素可以通过串联(元素可以重复使用,相当于 Pascal 中的 “+” 运算符)组成一个序列 S ,那么我们认为序列 S 可以分解为 P 中的元素.元素不一定要全部出现(如下例中B

USACO prefix TrieTree + DP

/* ID:kevin_s1 PROG:prefix LANG:C++ */ #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <vector> #include <map> #include <set> #include <algorithm> #include <cstdlib>

【USACO 1.3.4】牛式

[題目描述 ] 下面是一个乘法竖式,如果用我们给定的那n个数字来取代*,可以使式子成立的话,我们就叫这个式子牛式. * * * x * * ---------- * * * * * * ---------- * * * * 数字只能取代*,当然第一位不能为0,况且给定的数字里不包括0. 注意一下在美国的学校中教的"部分乘积",第一部分乘积是第二个数的个位和第一个数的积,第二部分乘积是第二个数的十位和第一个数的乘积. 写一个程序找出所有的牛式. [格式] INPUT FORMAT: (f

USACO Chapter 1 Section 1.1

USACO的题解和翻译已经很多了... 我只是把自己刷的代码保存一下. 1.PROB Your Ride Is Here 1 /* 2 ID:xiekeyi1 3 PROG:ride 4 LANG:C++ 5 */ 6 7 #include<bits/stdc++.h> 8 using namespace std ; 9 10 int main() 11 { 12 freopen("ride.in","r",stdin); 13 freopen(&quo