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

隨筆 - 97, 文章 - 22, 評論 - 81, 引用 - 0
數據加載中……

SGU 130 - 139 解題報告

130 Circle                                                         數學:卡特蘭數
131 Hardwood floor                                         動態規劃:狀態壓縮
132 Another Chocolate maniac                       動態規劃:狀態壓縮
133 Border                                                       簡單統計
134 Centroid                                                    簡單統計
135 Drawing Lines                                           遞推
136 Erasing  Edges                                           數學:一次方程
137 Funny Strings                                            枚舉
138 Games of chess                                         貪心
139 Help Needed!                                            數學:逆序數相關性質


130 Circle

      卡特蘭數

 

      題意:給定一個圓,上面有2K個點,這2K個點可以互相連接,一個點只能連一次,問連接完畢將圓分割成最小的平面數的分割種類數。

      題解:

      1)首先K=1,最小平面為2,種數為f[1] = 1種。

      2)然后考慮K=2的情況,將K0K1連,那么剩下的情況就是K=1的情況,將K0K3連,那么剩下的也是K=1的情況,所以K=2的情況為f[0]*f[1] + f[1]*f[0] = 2, 分割的平面數為3

      3)按照和K=2一樣的遞推方式,K = 5 時的情況為:

               K0 - K1    ->   f[0] * f[4]

               K0 - K3    ->   f[1] * f[3]

               K0 - K5    ->   f[2] * f[2]

               K0 - K7    ->   f[3] * f[1]

               K0 - K9    ->   f[4] * f[0]

         于是可以得出遞推式: f[i] = sum { f[j] * f[i-1-j]  0 <= j < i }

131 Hardwood floor

       動態規劃狀態壓縮


 

 方塊A 方塊B

1

      題意:利用以上兩種積木(任意數量,可進行旋轉),拼出一個M*N( 1<= M <= 9, 1 <= N <= 9)的矩形,問這樣的方式有多少種。M = 2, N = 3 的情況 ,有以下5種拼接方式:

 


2

 

      題解:考慮到NM都很小,所以可以將每一行的狀態壓縮在一個二進制的整數中,0表示沒有放置,1表示已經放置,圖3的第一行狀態就可以表示成101000(二進制表示,紫羅蘭色表示上一行延伸過來的方塊,灰色表示暫時沒有放置方塊的格子)。這樣就可以通過枚舉第i行的所有狀態,擴展出第i+1行的所有狀態。

      舉例說明:

      如圖3,枚舉到第i行的狀態為 101000(二進制數,實際操作的時候是轉化成十進制然后通過位運算來變換狀態的),假設對于當前狀態的所有解的情況已經求出來,為DP[i][101000],然后可以通過枚舉列將第i行填滿。并且要記錄下當前行狀態now = 101000, 下一行狀態 next = 000000

      那么接下來一步就要開始枚舉列了,當枚舉到第一列時,發現當前格子已經被i-1行所占據,所以直接進入下一列,這一列為空,所以我們需要某種方式將它填滿,對于圖3的情況,一共有三種填充方式(3、圖4、圖5),因為格子不能重疊,所以在枚舉的時候需要判斷當前方塊放入的時候會不會導致和之前放置的方塊重疊,如果不會重疊說明狀態可達,否則不進入下一次迭代。

 now = 101000   next = 000000

3

now = 111000   next = 110000

4

now = 111000   next = 010000

5

now = 111000   next = 011000

6

      3的狀態一共生成三種狀態,然后我們繼續對生成的狀態進行擴展。以圖5的狀態為例,對它的狀態進行擴展,可以得到以下幾種狀態(橙色表示當前放入的方塊):
      1)放置一個橫躺的方塊A

now = 111110   next = 010000

7

      2)放置一個豎著的方塊A

now = 111100   next = 010100

8

3)放置一個 "7" 方塊B

now = 111110   next = 010100

9

4)放置一個 "L" 方塊B

now = 111100   next = 010110

10

5)放置一個 "7" 字方塊 B

now = 111110   next = 010010

11

6)放置一個 "L" 方塊 B

now = 111100   next = 011100

12

      枚舉列的過程是用dfs遞歸實現的,遞歸出口為列數col == N的時候,那時候當前行的狀態now一定是 2N - 1,因為要保證第i行能夠被填充滿,于是就可以得出狀態轉移方程DP[i+1][ next ] += DP[i][ now ]

      繼續枚舉第i+1行的所有狀態,擴展i+2行的可達狀態。

      然后就要考慮初始狀態的情況,可以虛擬出一個第0行,那么第0行的狀態除了2N-1的情況為1,其他必定是0(因為是虛擬出來的,可以理解為全部填滿的狀態)。然后通過第0行的這個狀態可以迭代計算出第1行的各種可達狀態的解數。直到第M行,最后解的情況是DP[M+1][0]的值而非DP[M][2N-1](因為枚舉到第M行后,第M行的非全滿的狀態也可以導致最后的格子鋪滿)。


132 Another Chocolate Maniac

      動態規劃狀態壓縮

      題意:給定一個M*N (M <= 70, N <= 7)的棋盤,求放置最少數量的多米諾骨牌(大小為2X1),使得它不能再放置更多的骨牌,給定的棋盤某些點不能被放置。

      題解:沿用131那題的思路,但是這題只知道前一行的狀態是不夠的(因為多米諾骨牌的大小為2X1),考慮下面這種情況:


1

      現在需要推導第i+2行的狀態,考慮在(i+2, 4)(紅色方塊)上如果不放置骨牌是否合法,那么由于(i+1, 4)為空,但是我們無法知道第i行的那個?格子到底是空還是非空,所以無法對紅色格子進行狀態轉移,所以需要將狀態表示稍作變形。

      對于每一行用一個3進制的整數表示當前一行的狀態,定義以下常量:

      #define STATE_PRE_EMPTY  0 // 上一行對應格為空

      #define STATE_PRE_FULL    1 // 上一行對應格為滿

      #define STATE_NOW_FULL   2 // 當前行對應格為滿

      那么圖1的情況就可以表示成下面的狀態:


2

      ?格子所代表的的狀態就可以通過i+1行的那個值來確定了,i+1行對應列的格子值為0,表示第i行對應列的格子為未放置狀態(再上一行的狀態就不需要關心了,因為骨牌的最大長度為2)。

       那么如果前一行對應列的狀態值為0的時候,必須放置一個骨牌(如果因為有障礙無法放置,那么說明這個狀態無法往下轉移了)。知道方法之后,具體做法就是初始化狀態,這里我們為了運算簡便,可以虛擬出一個第零行來,對于第0行,它一定是全部塞滿的,所以第0行只有一個合法狀態,即:DP[0][ 3N - 1 ] = 0(每格的狀態都是2,最小骨牌數為0),然后通過這個狀態,進行行枚舉,每一行進行列位移(可以采用dfs實現),將上一行的狀態推導產生下一行的可行狀態,每次dfs模擬放置和不放置兩種情況;

       最后DP[M+1][ 3N - 1 ]就是最后的答案。

 

133 Border

      簡單統計

      題意:給定N(N <= 16000)個整數對(Ai, Bi),如果存在一個整數對(A j, Bj)   使得  Aj < Ai  并且Bi < Bj  則稱(Ai, Bi)是多余的,問整數對中有多少是多余的。

      題解:將整數對按Ai遞增排序,然后遍歷Bi記錄最大值,每次遇到比最大值小的可以斷定一定是多余的,計數器加1。知道遍歷完畢輸出即可。


134 Centroid

      枚舉 + 樹形統計

題意:給定一棵樹,刪除樹上的某個結點(以及它所附帶的邊)i,剩下的各個連通塊中結點數目最大值為Ti,求 M = Min{Ti  1<= i <= n},并且輸出刪除哪些點,能得到這個最小值M

題解:遍歷一棵樹,并且用sum[i]記錄以i為根結點的樹的結點數目,通過一次遍歷就能把所有的sum求出來。記錄M = n;然后遍歷根結點,對于刪除i結點,剩下連通塊中的最大值為 max( n - sum[v],  max{sum[v]   vi個直接子結點}  )。同樣一次遍歷就能將所有的值求出來。


135 Drawing Lines

      公式題
      答案:n(n+1)/2 + 1
      只是奇怪不能寫成 while (scanf("%d", &n) != EOF) 的形式,會PE。

136 Erasing Edges

      數學題

      題意:給定一個多邊形SN條邊的中點,求這個多邊形S

      題解:假設原多邊形中點集合為Ci,多邊形點集合Pi

       假設 0個點P0 = (x, y),那么第一個點的坐標可以通過C0計算出來,即P1 = 2*C0 - P0,同理第二個點可以通過C1計算出,并且可以用P0的一次函數來表示,做n-1次迭代就可以把Pn-1P0表示出來,而 Pn-1 + P0 = Cn-1,所以xy都可以通過一次線性方程求出解來(也有可能有無解的情況)。然后再做n-1次迭代將所有點求出來即可。

 

137 Funny Strings

      記憶化搜索


      題意:對于一個序列S1, S2, S3 ... SN, 如果S1+1, S2, S3 ... SN-1進過一些左移或者右移幾次操作,可以和原序列保持一致,則稱這個序列為Funny String,給定NK,求長度為N,和為KFunny String

       題解:首先考慮,左移后第幾位和原來的第一位對應,可以假設是第i位吧,那么有以下關系式:

       S[1] + 1 = S[i]      ...        (1)

       S[2] = S[i+1]        ...        (2)

       S[3] = S[i+2]        ...        (3)

       ......

       S[j] = S[1]              ...      (N-i+2)

       S[j+1] = S[2]          ...      (N-i+3)

       ......

       S[n-1] = S[i-2]        ...      (N-1)

       S[n] - 1 = S[i-1]     ...       (N)

       顯然i不可能為1,因為S[1] + 1 != S[1]

       并且GCD(N, (i-1)) 必須為1,否則這個等式組會存在內環,無法求解。

      

       接下來就可以通過記憶化搜索將S[2] ... S[N] 的值都用S[1] 表示出來。

       表示方式有很多種,例如用一個二元組Tk = (ak, bk)來保存對于前一項的系數,

      例如:

             S[i] 可以表示為 Ti = (1, 1) ( S[i] = 1 * S[1] + 1)

             S[i+1] 可以表示為 Ti+1 = (1, 0) ( S[i+1] = 1 * S[2] + 0)

      這里的S[2]尚未計算出來,所以需要遞歸計算,具體計算方法第j項的方法如下:

getS ( j )
       if j == i
              return (1, 1)
       else if j == i - 1
              (ta, tb) = getS(n)
              return (ta, tb - 1)
       else if j > i
              return getS( j - i + 1)
       else if j < i
              return getS(N + j - (i-1))

      遞歸原因來自上面那N個等式,其中ta一定為1tb10

      所以這題的做法就是枚舉左移點i,計算出所有數對于S[1]的一次線性表示形式,然后利用所有數之和為K這個條件,求出非負整數S[1],就能將所有數都求出來了。


138 Games of Chess

      貪心


      題意:給定N(N <= 100)個人的比賽場數X[i],需要構造一個比賽安排,假設G表示所有人的參賽場數之和,一共G/2場比賽,那么需要輸出G/2行,每行為a bab表示參賽隊員的編號,其中a不等于b,并且a是勝利方,當前場的勝利方需要在上一場比賽中出現過(類似不斷淘汰的機制)。

      題解:將每個人的參賽場數X[i]從大到小排序,如圖1所示,共有八位參賽選手,參賽場數分別為43211111,總和為14,所以總共有7場比賽。從第一個選手開始,將他的前X[i] - 1場比賽在賽程表的前X[i] - 1個位置的勝場中填滿,他的最后一場比賽和場數次多的人比,并且輸掉,將場數次多的人的剩余場數按照同樣的方式去填賽程表,直到所有比賽的勝利方都確定(即表中左邊那一列不為空),然后將剩下的還有剩余比賽的填在失敗方即可。


圖1

 
139 Help Needed!

      數學證明

      
       
題意:如圖,給定一個亂序的十六數碼,問是否能通過一些移動,將它恢復到初始狀態(0的位置表示空缺位置,非0位置上的方塊可以向0移動,移動只能在上下左右四個方向進行)。


 

1

 

      題解:只需要判斷 當前狀態數碼的逆序數 0到目標點曼哈頓距離 的奇偶性 即可。

      證明如下:

       首先將目標數碼排成一排,計算它的逆序數為15(為了便于理解,將每一行的數碼涂成不同的顏色)。


 

2

       然后來看任意狀態的逆序數:


 

3

       I如圖3,考慮當前狀態下的水平移動,即X可以向0移動,Y也可以向0移動(也可以理解成兩個方塊的交換)。對于這兩種情況:

       1) X 0交換(X > 0),交換后的數碼,逆序數-1

       2) Y 0交換(Y > 0),交換后的數碼,逆序數+1


 

4

       II)如圖4,考慮當前狀態下的豎直移動,即A可以向0移動,B也可以向0移動。

由于兩者情況是一樣的,這里只介紹A0交換的情況。

       假設A0中間的三個方塊(十六數碼,一定是三個方塊)中比A小的有x個,那么比A大的就是(3-x)個,這三個方塊的本身逆序數為K,那么:

       1)交換前,A 0 這個區間段的逆序數為 x + 1 + K + 3;

       2)交換后,A 0 這個區間段的逆序數為 (3-x) + K;

       交換前后逆序數的差值為  (3-x) + K - (x + 1 + K + 3) = -2x - 1;

      綜合I II發現,每進行一次交換,逆序數的變化一定是奇數,最終狀態的逆序數15也是奇數,所以如果某個狀態逆序數和 0到目標點的曼哈頓距離 的奇偶性一致時,必定是無解的。

 

 

 


posted on 2014-06-23 19:08 英雄哪里出來 閱讀(2544) 評論(0)  編輯 收藏 引用 所屬分類: Sgu 題解

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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热这里只有精品8| 久久这里有精品视频| 久久精品91| 欧美va亚洲va国产综合| 欧美激情第3页| 欧美日韩一区二区三区视频| 欧美日韩色婷婷| 国产精品毛片高清在线完整版| 国产精品国产三级国产专播精品人| 欧美体内谢she精2性欧美| 国产情侣久久| 亚洲最新在线| 模特精品裸拍一区| 亚洲欧美日韩一区| 欧美日韩国产一区二区三区地区 | 亚洲精品日韩在线观看| 午夜欧美电影在线观看| 最近中文字幕mv在线一区二区三区四区| 欧美激情亚洲视频| 欧美一区二区久久久| 欧美极品aⅴ影院| 亚洲国产老妈| 免费永久网站黄欧美| 亚洲欧美一区二区三区极速播放 | 亚洲福利视频三区| 亚洲高清不卡| 性刺激综合网| 亚洲在线日韩| 国产精品一区免费观看| 午夜视频一区二区| 99精品国产在热久久| 欧美日韩中文在线| 亚洲一区日韩| 欧美亚洲免费电影| 在线观看日产精品| 亚洲第一主播视频| 欧美日韩福利| 欧美伊人精品成人久久综合97 | 久久成人精品电影| 亚洲欧美日韩一区在线观看| 国产精品三上| 免费在线亚洲欧美| 欧美网站在线观看| 久久久av水蜜桃| 欧美激情在线狂野欧美精品| 欧美一区免费视频| 麻豆91精品| 久久se精品一区二区| 免费亚洲网站| 久久视频在线看| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲精品在线观看免费| 久久成人这里只有精品| 宅男噜噜噜66一区二区| 久久久久久久久久久久久9999| 91久久国产精品91久久性色| 亚洲一区二区成人在线观看| 亚洲精品婷婷| 美女精品在线| 欧美va天堂在线| 久久五月激情| 91久久久在线| 久久免费黄色| 日韩一级网站| 亚洲成人在线观看视频| 欧美另类视频| 久久久久免费视频| 亚洲视频在线观看一区| 亚洲永久视频| 国产香蕉97碰碰久久人人| 午夜精品久久久久久久99樱桃 | 久久精品国产99国产精品| 欧美视频在线观看视频极品| 亚洲精品国精品久久99热| 亚洲精品久久久久久久久久久久久| 久久乐国产精品| 久久综合99re88久久爱| 亚洲国产欧美在线人成| 国产精品欧美风情| 另类亚洲自拍| 午夜影院日韩| 亚洲黄色av| 国产精品亚洲产品| 麻豆av一区二区三区| 亚洲精品一区二区三区四区高清 | 99ri日韩精品视频| 中文亚洲免费| 在线不卡中文字幕| 欧美全黄视频| 久久福利资源站| 亚洲精品日韩激情在线电影| 蜜桃久久精品乱码一区二区| 麻豆国产精品777777在线| 午夜精品福利在线| 韩日成人在线| 国产一本一道久久香蕉| 免费日韩视频| 久久se精品一区精品二区| 一区二区三区日韩精品视频| 免费观看成人鲁鲁鲁鲁鲁视频| 亚欧成人精品| 午夜精品久久久久久久久| 亚洲一区二区三区免费视频| 中文在线不卡| 久久精品视频在线免费观看| 久久夜色精品国产亚洲aⅴ| 欧美国产高清| 亚洲午夜一区| 蜜桃av一区二区| 久久精品亚洲热| 久久经典综合| 欧美电影免费观看| 亚洲精品国产视频| 99视频精品免费观看| 中国亚洲黄色| 久久精品国产99国产精品| 久久久999| 欧美日韩福利| 国产女主播视频一区二区| 国产偷国产偷亚洲高清97cao| 国产一区二区三区的电影| 韩日视频一区| 亚洲无玛一区| 久久伊人免费视频| 亚洲精品国产精品国自产观看 | 在线播放日韩专区| 亚洲精品国产精品国自产观看浪潮| 中国成人在线视频| 午夜亚洲精品| 亚洲国产色一区| 亚洲欧美一区二区精品久久久| 久久精品二区三区| 欧美成人一二三| 亚洲一区在线观看免费观看电影高清| 久久精品国产亚洲高清剧情介绍| 裸体女人亚洲精品一区| 国产午夜精品全部视频在线播放 | 狂野欧美性猛交xxxx巴西| 亚洲人成久久| 久久永久免费| 韩日欧美一区| 美女尤物久久精品| 欧美在线播放| 国产视频一区二区在线观看| 亚洲影院一区| 亚洲综合色网站| 国产精品久久午夜| 亚洲欧美成aⅴ人在线观看| 99re66热这里只有精品3直播| 久久这里有精品视频| 亚洲国产欧美久久| 亚洲福利视频一区二区| 久久综合伊人| 亚洲一区二区在线看| 一本色道久久综合亚洲91| 欧美午夜免费| 久久综合久久综合久久综合| 久久久www免费人成黑人精品| 韩国精品久久久999| 欧美国产精品日韩| 欧美丝袜第一区| 久久久人成影片一区二区三区| 久久婷婷国产综合尤物精品 | 亚洲精品美女久久7777777| 欧美激情成人在线| 国产精品日韩专区| 久久综合色综合88| 国产精品男人爽免费视频1 | 亚洲韩国精品一区| 国产偷久久久精品专区| 91久久精品美女| 国产人成一区二区三区影院| 亚洲第一级黄色片| 国产午夜精品久久久| 亚洲精品久久7777| 在线观看亚洲视频啊啊啊啊| 夜夜嗨av一区二区三区四区| 一区在线观看视频| 欧美在线视频全部完| 亚洲女同性videos| 欧美日韩国语| 亚洲欧洲日本一区二区三区| 国产精品久久久久久福利一牛影视 | 亚洲电影av在线| 国产精品永久免费在线| 亚洲激情六月丁香| 韩国在线一区| 亚洲自拍啪啪| 午夜亚洲激情| 国产精品综合久久久| 亚洲美女在线看| 欧美一区二区精美| 国产一区二区你懂的| 久久久99久久精品女同性| 欧美刺激性大交免费视频| 亚洲国产精品欧美一二99| 老司机午夜精品视频| 欧美大片一区| 亚洲欧美视频一区|