Time of Update: 2018-12-05
題目大意:在手機鍵盤N個按鍵上布置K個字元(1<=N<=K<=90),每個按鍵上可以布置任意多個字元,字元在鍵盤上的布局必須按照字元順序。在手機上輸入某個字元需要按鍵的次數等於這個字元在這個按鍵上排列的位置pi(和日常手機規則一樣),每個字元都有一個使用頻率fi,那麼輸入一個字元的平均費用為pi×fi。要求輸出一種手機字元按鍵的布局方案,使得總平均輸入費用最小。分析:題目好長,開啟網頁就沒有讀下去的慾望……典型的動態規劃題目。很多年前的動態規劃看起來都很簡單的樣子。令f[i][
Time of Update: 2018-12-05
模板題,不說了,整理一下模板: /*PKU1459 Power Network*/#include <stdio.h> #include <stdlib.h> #include <memory.h> #define clr(a) memset(a,0,sizeof(a)) #define N 200 #define INF (1<<25)
Time of Update: 2018-12-05
題目描述:遊戲者AB分享N個麵包圈,由A開始輪流取麵包,每次不超過M個。當某人取得最後一個麵包圈時為勝利者。勝利者可以吃掉已經取得的麵包圈,失敗者將自己取得的麵包圈拿出來重新開始遊戲,並由失敗者開始取。假設AB兩人都使用最佳決策,問A最多能吃到多少麵包圈。 題目分析:想了好久,DP思路還是不清晰,在網上搜了一下才豁然開朗。不過網上那個公式比較冗餘,我把他的公式降了一維下來。設f[s][d][r]表示當前遊戲者取得s個,對手取得d個,剩餘r個麵包圈時,當前遊戲者最終最多能吃到麵包圈的數量。當r&g
Time of Update: 2018-12-05
題目大意:N個騎士某些騎士之間會有仇恨。騎士們開會時圍坐在一個圓桌旁。一次會議能夠舉行,若且唯若沒有相鄰的兩個騎士相互仇恨,且開會人數為大於2的奇數。若某個騎士任何會議都不能參加,那麼就必須將它踢出。給出騎士之間的仇恨關係,問需要踢出多少個騎士。分析:首先,求出無向圖的塊(即同一個塊中沒有割點)。塊中的節點一定是可以組成環的。可以證明,若塊中存在一個奇圈,那麼塊中所有頂點都在一個奇圈上。那麼,對於每個塊進行判定,若該塊存在奇圈,則塊中所有的騎士都不會被踢出。即可求解。需要注意的是,同一個頂點可能
Time of Update: 2018-12-05
題目大意:一個N×M的網格,每個格子有兩種礦石含量為aij,bij。處理a礦石的工廠在地圖的左邊,處理b礦石的工廠在地圖的上邊。現在需要在地圖上修若干條鐵軌,每個格子的鐵軌要麼東西朝向,要麼南北朝向,運輸礦石的軌道不能拐彎。要求總共能運輸多少礦石。分析:可以看出,若要將礦石運回工廠,必須從這個格子朝左邊或上邊筆直修一條軌道。否則這個格子的礦石不能被運出去。我們用狀態f[i][j]表示格子i,j左上方的矩形地區能夠運送的最大礦石量。a[i][j],b[i][j]分別表示每個格子兩種礦石的含量。為了
Time of Update: 2018-12-05
題目大意:一個N*N的網格中(N<=4),有些格子是牆。問在這個網格中最多能放置多少個士兵,使得他們在四個方向上不能相互攻擊。分析:這是一個古老的題目了,我最開始學ACM的時候一眼就能看出來這是一個搜尋題,並且也能毫不費力地寫出一段搜尋代碼把它過掉。後來聽羅老師講了這個題之後才知道,原來還有更高效的匹配演算法來解決這個問題。(按照羅老師的原話說,這個題目出題的本意就是讓大家用匹配來做……>_<)可以這樣來構造匹配模型。假設沒有牆阻擋,那麼把地圖的行和列作為二部圖的兩側頂點,i行
Time of Update: 2018-12-05
題目描述:某人要對拳皇的人物做一個排序。輸入一個N,接下來N行每行兩個字串A B,表示A比B厲害。要求一共有多少種不同的拓撲排序方法。若不能完成排序輸出0。 分析:可以用動態規劃來解決。對於n個節點進行拓撲排序,設當前有m個度為0的節點,記為Zi。所以當前可以選擇這m個度為0的節點中的任意一個排在前面,剩下的節點有多少種排序方法與之前無關。所以可以用節點集合表示狀態。狀態的轉移也就是從當前集合去掉某個度為0的節點。那麼,狀態S的計數總數 = ∑
Time of Update: 2018-12-05
模板題,整理代碼…… /*PKU2516 Minimum Cost*/#include <stdio.h> #include <memory.h> #define clr(a) memset(a,0,sizeof(a)) #define N 200 #define INF (1<<25) int DualityEdmondsKarp(int g[][N],int w[][N],int n,int s,int t,int f[][N],int *minCost)
Time of Update: 2018-12-05
題目描述:有一個人發明了一種新的用筷子的方法,每次用三根筷子,筷子長度不一(A<=B<=C),規定三根筷子的“不合適度”用(A-B)^2來表示。現在有n根長度不一的筷子,問選出m副筷子的最小不合適度之和是多少。輸入時按照筷子長度非降序輸入。分析:這個動態規劃的變形比較奇怪,三個筷子的長度,最長那根是沒有用的,但是必須要有。數組a[i]表示第i根筷子的長度,按照非升序排列,下標從1開始。用狀態f[i][j]表示從前i根筷子選出j副,得到的最小不合適度。可以證明,若用選第a[i]根筷子
Time of Update: 2018-12-05
題目描述:用1×2的多米諾骨牌,拼成4×w的矩形,總共有多少種方法?分析:經典題了,貌似我做過很多系列的這種題目,終於開竅了~/*ZJU2994 Tiling a Grid With Dominoes*/#include <stdio.h> #include <string.h> #define N 100 #define L 20 #define clr(a) memset(a,0,sizeof(a))
Time of Update: 2018-12-05
題目描述:給出兩個字串,求兩個字串的最長公用子序列的長度。 分析:經典的動態規劃題目。設字串為s,t。f[i][j]表示s前i個字母和t前j個字母組成的最長公用子序列長度。狀態轉移方程:f[i][j] = f[i-1][j-1]+1 (s[i]==t[j])f[i][j] = max{ f[i-1][j] , f[i][j-1] }/*ZJU1733 Common Subsequence*/#include #include #define N 205#define MAX(a,b) ((a)
Time of Update: 2018-12-05
題目描述:用方括弧表示出一個完全二叉樹,要使得任意一個節點的左右兩邊權重相等,總權重至少要多少?分析:最開始想用鏈表做一顆二叉樹,然後對每個節點遞迴找左右兩邊的權重,取較大的一邊。寫著寫著發現不用鏈表建樹也行,遞迴本身就是一個樹形結構。於是直接用遞迴來表示。寫完後發現WA……鬱悶了好半天,猜想是不是總權重等於2^Deepth,結果AC了。這樣一來遞迴都不用,線性掃描就行/*ZJU2992 Monkey Vines*/#include <stdio.h> #define MAX(a,
Time of Update: 2018-12-05
題目描述:一個人去n個湖釣魚,第i個湖裡初始時一個單位時間可以釣fi條魚,下一個單位時間釣的魚數量遞減di。湖的排列是線性,從第i個湖走到第i+1個湖需要ti的時間。現在有m時間可用,初始在第一個湖,問最多可以釣多少魚。分析:很明顯題目條件滿足無後效性,可以用動態規劃來解決。設dp[i][j]表示在前i個湖花費j的時間最多釣魚數量(並停留在第i個湖)。getFish(i,t)表示在第i個湖花費t時間總共獲得的魚數量。狀態轉移方程:dp[i][j] =
Time of Update: 2018-12-05
題目描述:RGB三種顏色的球排成一行,首先消除連續相同顏色最長的最左邊的一段,剩下的球左右串連起來繼續以上消除過程。列印每次消除小球的顏色和編號。n<=10^6分析:PKU的解題報告上說用並查集+優先隊列。我不知道並查集怎麼用比較合適,我用了鏈表儲存序列+堆尋找最長序列。總之代碼比較繁瑣,這裡不想貼出來了。寫完之後人肉測試沒有發現什麼問題,交上去過後得到RE。我想是不是資料大了之後會有問題,於是產生一組長度為n的“單色”球序列。我發現當n>10000的時候本機上就會出錯,資料量小的時
Time of Update: 2018-12-05
題目大意:Bob帶著他的Dog外出散步,Bob速度固定且依次沿著n個點行走,分別用(Xi,Yi)表示。Dog的速度可以達到Bob的2倍。在路途中有m個地點是Dog喜歡玩耍的地方,用(Xi',Yi')表示。Dog和Bob同時從第一個點X1,Y1出發,Dog在路途中跑去玩耍,但是必須在Bob到達第二個點X2,Y2時趕回來和Bob碰面。每次離開Bob,Dog最多隻能去一個地方玩耍,以前去過的地方Dog不會再去。輸入Bob的行走路線的n個點,和Dog喜歡玩耍的m個點,要求Dog最多能去多少地方玩耍並輸出
Time of Update: 2018-12-05
題目描述:在n*m的格子中,某些格子不能通過。現在從左上方的格子出發,每個格子只經過一次,問能否遍曆所有的格子。(m,n<7) 分析:很鬱悶的是,一開始的時候以為是歐拉通路的問題。後來發現不是,而是典型的哈密爾頓通路……我還天真的想,能否通過某種方式轉換一下,使原來的節點拆為變來處理。只能是無果而終,因為要是能轉換的話,哈密爾頓通路問題也就能轉換為歐拉通路問題得到高效的解決,而事實上是impossible的……哈密爾頓通路問題屬於NP完全問題,沒有很高效的方法,只能暴力搜尋。還有一些剪枝,
Time of Update: 2018-12-05
題目大意:一個字元三角形可能出現'@' ,'*'
Time of Update: 2018-12-05
題目描述:給定一個長度為N的數字序列{ai},問總共有多少個長度為5的上升子序列。(ai<10^9,N<=50000)分析:由於數字範圍很大,首先將數字離散化為1~N之間的整數。原a[]數群組轉換為d[]數組,其中d[i]=j表示a[i]是a[]數組中第j小的數。可以用動態規劃來描述這個演算法:p從0到N,令i=d[p]。f[i][k]表示以數字i為結尾,長度為k的上升序列的個數。f[i][k]+=∑f[j][k-1](1<=j<i)f[i][1]=1這樣的動態轉移方程是
Time of Update: 2018-12-05
題目大意:n個城市之間有h條道路(n<10,h<20),每條道路都被塗成一種顏色。當汽車的輪胎顏色和道路顏色一致時,才能在道路上行駛。馬可波羅從任意城市出發,初始時輪胎可為任意顏色。他遍曆每條道路僅一次,問最少需要換多少次輪胎。分析:典型的歐拉通路問題,即一筆畫問題。用深度優先搜尋就好。要注意的是需要考慮道路不連通的情況。 /*ZJU2103 Marco Popo the Traveler*/#include <stdio.h>#include <memory.h&
Time of Update: 2018-12-05
BNUEP1201 PKU2941 Homogeneous Squares題目大意:一個N×N的數字矩陣, 若在矩陣中任意取N個數字,每個數位行列互不相同,其和都是一個定值,則該矩陣是"Homogeneous"的,否則是"Not