青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

QuXiao

每天進步一點點!

  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
  50 隨筆 :: 0 文章 :: 27 評論 :: 0 Trackbacks

解題報告


題目來源:

PKU 1037 A decorative fence

分類:

DP

原文:

A decorative fence

 

Time Limit: 1000MS


Memory Limit: 10000K

Total Submissions: 2051


Accepted: 608

Description

Richard just finished building his new house. Now the only thing the house misses is a cute little wooden fence. He had no idea how to make a wooden fence, so he decided to order one. Somehow he got his hands on the ACME Fence Catalogue 2002, the ultimate resource on cute little wooden fences. After reading its preface he already knew, what makes a little wooden fence cute.
A wooden fence consists of N wooden planks, placed vertically in a row next to each other. A fence looks cute if and only if the following conditions are met:
?The planks have different lengths, namely 1, 2, . . . , N plank length units.
?Each plank with two neighbors is either larger than each of its neighbors or smaller than each of them. (Note that this makes the top of the fence alternately rise and fall.)
It follows, that we may uniquely describe each cute fence with N planks as a permutation a1, . . . , aN of the numbers 1, . . . ,N such that (any i; 1 < i < N) (ai − ai−1)*(ai − ai+1) > 0 and vice versa, each such permutation describes a cute fence.
It is obvious, that there are many di
erent cute wooden fences made of N planks. To bring some order into their catalogue, the sales manager of ACME decided to order them in the following way: Fence A (represented by the permutation a1, . . . , aN) is in the catalogue before fence B (represented by b1, . . . , bN) if and only if there exists such i, that (any j < i) aj = bj and (ai < bi). (Also to decide, which of the two fences is earlier in the catalogue, take their corresponding permutations, find the first place on which they differ and compare the values on this place.) All the cute fences with N planks are numbered (starting from 1) in the order they appear in the catalogue. This number is called their catalogue number.


After carefully examining all the cute little wooden fences, Richard decided to order some of them. For each of them he noted the number of its planks and its catalogue number. Later, as he met his friends, he wanted to show them the fences he ordered, but he lost the catalogue somewhere. The only thing he has got are his notes. Please help him find out, how will his fences look like.

Input

The first line of the input file contains the number K (1 <= K <= 100) of input data sets. K lines follow, each of them describes one input data set.
Each of the following K lines contains two integers N and C (1 <= N <= 20), separated by a space. N is the number of planks in the fence, C is the catalogue number of the fence.
You may assume, that the total number of cute little wooden fences with 20 planks fits into a 64-bit signed integer variable (long long in C/C++, int64 in FreePascal). You may also assume that the input is correct, in particular that C is at least 1 and it doesn
exceed the number of cute fences with N planks.

Output

For each input data set output one line, describing the C-th fence with N planks in the catalogue. More precisely, if the fence is described by the permutation a1, . . . , aN, then the corresponding line of the output file should contain the numbers ai (in the correct order), separated by single spaces.

Sample Input

2

2 1

3 3

Sample Output

1 2

2 3 1

Source

CEOI 2002

 

 

中文描述:

                首先告訴你,如果一個由n個木條構(gòu)成的柵欄是美觀的,那么它必須具備兩個條件:1n個木條必須具有不同的長度;2、與任一木條相鄰的兩個木條,它們的高度既不會都比中間的木條高,也不會都比中間的木條低。(也就是說柵欄呈“波浪”型排列)由n個木條構(gòu)成的柵欄,可以有多種排列方式。為了區(qū)分這些排列方式,還定義了排列方式之間的大小關(guān)系。假設一種排列方式為aa1,a2,a3…an),另一種排列方式為bb1,b2,b3…bn),a<b當且僅當存在i使得,對于任意j<iaj=bj,且ai<bi。(其實就是字典順序。)現(xiàn)在給你木條數(shù)ncn個木條構(gòu)成的柵欄,排列順序從小到大排列,問你第c中排列的順序是什么。

題目分析與算法模型

                通過分析可以知道,木條的具體長度是多少并不重要,只要滿足木條之間的長度不相等就可以了。為了簡單起見,就設n根木條的長度從小到大依次為1n。先從n比較小的情況找找規(guī)律,比如n=4,那么排列順序為:1 3 2 41 4 2 32 1 4 32 3 1 42 4 1 33 1 4 23 2 4 13 4 1 24 1 3 24 2 3 1。可以看出,當?shù)谝晃粩?shù)字X已經(jīng)確定時,X后面的數(shù)字一定是先從1X-1開始考慮(比X低的那些木條),然后再從X+1n考慮(比X高的那些木條)。其實,我們可以把排列方式分為兩種,一種是第一個木條比第二個木條高的排列方式,我們簡記為W方式;另一種是第一個木條比第二個木條低的排列方式,我們簡記為M方式。當?shù)谝粋€數(shù)字確定時,我們總是首先考慮所有W方式,等W方式全部考慮完,再去考慮所有的M方式。那么,n個木條的排列順序就為:

W1         (以第一根木條開始的W排列方式)

M1         (以第一根木條開始的M排列方式)

W2        

M2

Wn

Mn

                假設我們可以知道每一種排列方式的種類,那么我們就可以判斷出我們要求的第c種排列方式落在了上述的哪個區(qū)間,這樣我們就可以把第一根木條確定下來。規(guī)模較小到了1n-1,若木條落在W方式下,我們就找下一個的M方式;若木條是落下M方式,我們就找下一個的W方式,用同樣的方法確定第二根木條,然后以此類推,求出所有的木條,問題就可以解決了!但是別急,貌似其中還有一些問題。當我們確定了一根木條,去找第二根木條時,剩下的木條的長度就是不連續(xù)的了,子問題與原問題是同一類問題嗎?其實不用擔心,原問題是1n個長度不同的木條以M或者W方式排列的個數(shù),我們只是為了方便記錄狀態(tài),而將他們的長度規(guī)定為1n,即使它們的長度是不連續(xù)的,問題的本質(zhì)還是一樣的。我們可以這樣想:我們在第一步確定了1n個木條中的第x個,那么我們在尋找下一根木條時,事先可以將(x+1)~n的木條長度減1,這樣長度就變成了長度為1~(n-1)的n-1根木條的排列問題了。

           我們可以設M[x][n]為由n個長度不同的木條組成的柵欄中,以其中第x根木條開始的“M”型排列的個數(shù),W[x][n]為由n個長度不同的木條組成的柵欄中,以其中第x根木條開始的“W”型排列的個數(shù)。可以推出以下公式:

                M[x][n] = ∑W[i][n-1]      (1<=i<=x-1)

                W[x][n] = ∑M[i][n-1]      (x<=i<=n-1)

                M[x][n] = W[n-x+1][n]  (長度從小到大排列的木條,第x根與第n-x+1根是對應的)

                這樣確定了狀態(tài)和狀態(tài)轉(zhuǎn)移,只要事先進行預處理,計算出WM,就可以一步步推算出區(qū)間,最終算出第c個排列的情況。這里要注意:在查找第一根木條時,既要考慮W方式,又要考慮M方式。而在已找到是在W(或M)方式的區(qū)間的時候,就只能考慮M(或W)方式了。

               

代碼:


#include <iostream>
using namespace std;
 
const int MAX = 21;
 
__int64 W[MAX][MAX];
__int64 M[MAX][MAX];
int used[MAX];         //用于輸出時判斷木條的使用情況
__int64 c;
int n;
 
void Input ()
{
        scanf("%d%I64d", &n, &c);
}
 
//利用遞歸進行初始化
__int64 getDown (int x, int n);
__int64 getUp (int x, int n);
 
__int64 getDown (int x, int n)
{
        if ( W[x][n] != -1 )
               return W[x][n];
        int i;
        __int64 ans;
        ans = 0;
        for (i=1; i<x; i++)
               ans += getUp (i, n-1);
 
        return ( W[x][n] = ans );
}
 
__int64 getUp (int x, int n)
{
        if ( M[x][n] != -1 )
               return M[x][n];
 
        return ( M[x][n] = getDown(n-x+1, n) );
}
 
void Init ()
{
        int i, j;
 
        memset(W, -1, sizeof(W));
        memset(M, -1, sizeof(M));
 
        for (i=1; i<=MAX; i++)
               W[1][i] = 0;
        W[1][1] = 1;
        M[1][1] = 1;
        W[1][2] = 0;
        M[1][2] = 1;
        W[2][2] = 1;
        M[2][2] = 0;
 
        for (i=3; i<=MAX; i++)
        {
               for (j=1; j<=i; j++)
               {
                       getDown(j, i);
                       getUp(j, i);
               }
        }
 
}
 
//子問題中,1k范圍內(nèi)第x根木條實際的位置
void Output (int x, int k)
{       
        int i;
        do
        {
               for (i=1; i<=k; i++)
               {
                        //1k中有以前已確定的木條,并且x木條比已確定的木
                        //條長度要長,那么x木條的長度應加1
                       if ( used[i] && x >= i )
                       {
                               x++;
                               k++;
                       }
               }
        } while ( used[x] );
        if ( k > 1 )
               printf("%d ", x);
        else
               printf("%d", x);
        used[x] = 1;
        
}
 
void Solve ()
{
        int up, i, first;
        up = 1;
        i = 1;
        first = 1;
        memset(used, 0, sizeof(used));
 
        while ( n > 0 )
        {
               if ( up == 1 )
               {
                       if ( c > M[i][n] )
                       {
                               if ( first )   //是否是在查找第1根木條
                               {
                                      up = !up;
                               }
                               c -= M[i][n];
                               i++;
                       }
                       else
                       {
                               Output(i, n);
                               first = 0;
                               //i = 1;
                               up = !up;
                               n--;
                       }
               }
               else
               {
                       if ( c > W[i][n] )
                       {
                               if ( first )
                               {
                                       up = !up;
                               }
                               c -= W[i][n];
                               if ( !first )
                               {
                                      i ++;
                               }
                       }
                       else
                       {
                               Output(i, n);
                               first = 0;
                               up = !up;
                               n--;
                               i = 1;
                       }
               }
        }
 
        printf("\n");
}
 
int main ()
{
        int test;
        cin>>test;
        Init ();
        while ( test-- )
        {
               Input ();
               Solve ();
        }
 
        return 0;
}

 

心得:

                當預感到一道題目可以用DP做時,不妨先想出一個可以表示問題的狀態(tài),再看是否可以根據(jù)題中的所描述的操作進行狀態(tài)轉(zhuǎn)移,并且看轉(zhuǎn)移之后的狀態(tài)是否是假設出的狀態(tài),即看自己假設出的表示問題的狀態(tài)是否具有最優(yōu)子結(jié)構(gòu)。若沒有,則應該假設另一種狀態(tài)或者在原先狀態(tài)的基礎(chǔ)上進行修改和加強,直到找出符合最優(yōu)子結(jié)構(gòu)的狀態(tài)。

posted on 2008-05-20 12:45 quxiao 閱讀(2153) 評論(3)  編輯 收藏 引用 所屬分類: ACM

評論

# re: PKU 1037 A decorative fence 2008-07-29 13:36 STARTING
很久不見你更新了阿~~  回復  更多評論
  

# re: PKU 1037 A decorative fence 2008-07-30 14:17 quxiao
@STARTING
最近也在寫解題報告,就是忘記貼上去了 :P  回復  更多評論
  

# re: PKU 1037 A decorative fence 2009-04-24 20:01 Las vagas
“我們可以這樣想:我們在第一步確定了1~n個木條中的第x個,那么我們在尋找下一根木條時,事先可以將(x+1)~n的木條長度減1,這樣長度就變成了長度為1~(n-1)的n-1根木條的排列問題了。”經(jīng)典!!!  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美丝袜一区二区三区| 亚洲图色在线| 在线一区欧美| 国产精品草莓在线免费观看| 中文精品一区二区三区| 久久精品视频导航| 怡红院精品视频| 欧美国产日韩亚洲一区| 亚洲午夜电影在线观看| 久久综合精品一区| 亚洲精品国精品久久99热| 国产精品mv在线观看| 欧美一区二区视频网站| 欧美国产精品人人做人人爱| 亚洲调教视频在线观看| 国产欧美日韩一区二区三区| 榴莲视频成人在线观看| av成人激情| 乱人伦精品视频在线观看| 日韩一级精品| 国产日韩亚洲欧美精品| 欧美国产精品一区| 亚洲在线第一页| 亚洲国产精品悠悠久久琪琪| 亚洲一区三区在线观看| 在线观看日韩av电影| 欧美日韩国产美女| 久久久水蜜桃| 亚洲精品国产系列| 久热精品在线视频| 亚洲一级在线观看| 亚洲福利视频二区| 国产精品日韩一区| 欧美精品在线视频观看| 欧美一区二区三区在线观看视频 | 亚洲人被黑人高潮完整版| 欧美视频三区在线播放| 麻豆av一区二区三区| 亚洲自拍另类| 亚洲精品一品区二品区三品区| 久久午夜视频| 性做久久久久久久久| 亚洲乱码精品一二三四区日韩在线 | 欧美人交a欧美精品| 欧美专区日韩专区| 在线亚洲自拍| 最新国产精品拍自在线播放| 裸体素人女欧美日韩| 欧美一区观看| 亚洲在线一区二区| 妖精视频成人观看www| 在线视频观看日韩| 国产主播精品| 国产亚洲欧美在线| 国产精品呻吟| 国产精品久久久久9999吃药| 欧美精品一区二| 免费在线日韩av| 久久最新视频| 久热re这里精品视频在线6| 久久国产精品久久久久久久久久 | 欧美揉bbbbb揉bbbbb| 欧美精品成人一区二区在线观看| 久久中文字幕导航| 久久一区二区三区四区| 久久国产福利| 久久精品免费电影| 久久激情五月婷婷| 久久久久国产一区二区三区| 久久高清国产| 久久免费午夜影院| 蜜臀久久99精品久久久久久9| 久久三级福利| 欧美顶级少妇做爰| 欧美日本一区| 欧美午夜一区二区| 国产美女精品一区二区三区| 国产精品日韩在线观看| 国产视频欧美视频| 国语自产在线不卡| 亚洲高清资源| 99国产精品视频免费观看| 一区二区三区高清不卡| 亚洲欧美久久久| 欧美一区二区三区男人的天堂| 欧美一区二区三区另类| 久久天堂av综合合色| 免费观看久久久4p| 91久久综合| 亚洲一二三区精品| 久久久久一本一区二区青青蜜月| 久久夜色精品国产欧美乱极品| 欧美α欧美αv大片| 欧美三级资源在线| 国产亚洲一区在线| 亚洲人线精品午夜| 亚洲一区精彩视频| 久久精品99国产精品酒店日本| 美女成人午夜| 日韩视频免费观看高清在线视频 | 欧美激情一区二区三区成人| 欧美性猛交一区二区三区精品| 国产乱理伦片在线观看夜一区| 黄色成人在线网站| 一本大道av伊人久久综合| 亚洲综合视频一区| 久久一区免费| 亚洲免费观看高清完整版在线观看熊 | 亚洲综合第一页| 久久露脸国产精品| 欧美日韩在线综合| 影音先锋久久精品| 亚洲午夜激情在线| 可以免费看不卡的av网站| 亚洲精品字幕| 久久久夜夜夜| 国产精品美女999| 亚洲国产va精品久久久不卡综合| 亚洲午夜视频| 欧美夫妇交换俱乐部在线观看| 亚洲视频 欧洲视频| 女主播福利一区| 国产一区二区福利| 一区二区三欧美| 女生裸体视频一区二区三区| 在线性视频日韩欧美| 欧美aaaaaaaa牛牛影院| 国产欧美一区二区白浆黑人| 99视频在线观看一区三区| 久久亚洲美女| 亚洲欧美日韩一区二区三区在线| 欧美成人精品| 狠狠色狠狠色综合日日五| 亚洲欧美日韩成人| 亚洲激情中文1区| 久久免费高清| 国产自产v一区二区三区c| 亚洲女性裸体视频| 亚洲欧洲日韩在线| 老司机午夜免费精品视频| 国产亚洲欧洲一区高清在线观看| 亚洲天堂免费观看| 亚洲精品资源美女情侣酒店| 媚黑女一区二区| 精品成人在线| 久久亚洲私人国产精品va媚药| 亚洲一区二区精品视频| 欧美日韩性视频在线| 亚洲免费播放| 亚洲高清视频中文字幕| 久久视频免费观看| 激情欧美日韩| 免费91麻豆精品国产自产在线观看| 亚洲欧美日本视频在线观看| 欧美视频一区二区三区四区 | 午夜精品视频网站| 一区二区三区精品在线| 欧美日韩三区四区| 亚洲视频香蕉人妖| 99视频在线精品国自产拍免费观看 | 国产亚洲欧美激情| 欧美专区在线播放| 亚洲欧美一级二级三级| 国产免费成人av| 午夜精品国产精品大乳美女| 一区二区三区精品在线| 国产精品久久久久久久久久直播| 亚洲一区二区视频在线| 一区二区三区视频在线播放| 国产精品videossex久久发布| 亚洲欧美日本国产有色| 亚洲性线免费观看视频成熟| 国产欧美日韩不卡| 久久免费99精品久久久久久| 久久久91精品国产| 亚洲国产精品久久人人爱蜜臀| 亚洲电影免费在线| 欧美日韩mv| 欧美亚洲一区二区在线| 欧美亚洲综合网| 在线日韩精品视频| 亚洲高清av| 国产精品久久久久91| 久久精品视频亚洲| 免费观看在线综合| 在线亚洲一区观看| 正在播放欧美一区| 国产在线拍偷自揄拍精品| 欧美成人精品一区二区| 欧美精品免费在线| 欧美一区二区精品| 狂野欧美激情性xxxx欧美| 一区二区三区av| 欧美一级淫片aaaaaaa视频| 亚洲国产婷婷香蕉久久久久久99| 亚洲蜜桃精久久久久久久| 国产一区二区久久| 亚洲精品在线一区二区| 国产欧美日韩| 亚洲精品九九|