USACO 3.2.2 Stringsobits (DP)

USACO 3.2.2 Stringsobits (DP)
DP

f[i][j] 表示长度为i 的01串,1的个数不多于j的个数。

则对于第i位是0还是1,可分为两个子状态 f[i][j]  =  f[i-1][[j] + f[i-1][j-1]

/**/ /*
ID: lorelei3
TASK: kimbits
LANG: C++
*/


#include 
< fstream >

using   namespace  std;

long   long  N,L,I;
long   long  f[ 100 ][ 100 ];

int  main() {

    
int i,j;

    ifstream fin(
"kimbits.in");
    ofstream fout(
"kimbits.out");

    fin
>>N>>L>>I;

    
for(i=0; i<=N; ++i)
        f[
0][i] = f[i][0= 1;

    
for(i=1; i<=N; ++i)
        
for(j=1; j<=N; ++j)
            f[i][j] 
= f[i-1][j] + f[i-1][j-1];

    
for(i=N; i>=1--i)
        
if(I>f[i-1][L]){
            fout
<<"1";
            I 
-= f[i-1][L];
            
--L;
        }
else
            fout
<<"0";

    fout
<<endl;
    
return 0;
}


你可能感兴趣的:(USACO 3.2.2 Stringsobits (DP))