準確的說,這個題叫遞推,不叫DP,用f[i,j]表示長度為i,和為j的方案數f[i,j]=∑f[i-1,j-k]邊界見程式。View Code 1 program pku2346(input,output); 2 var 3 f:array[0..5,0..45] of int64; 4 answer:array[0..11] of int64; 5 n:longint; 6 i,j,k:longint; 7 begin 8
統計字串中各個字母出現的次數並且輸出一個柱狀統計圖,注意用滑鼠去劃一下,每兩個‘*’柱之間有空格。。其他的就是類比了,水題View Code 1 program pku2136(input,output); 2 var 3 map :array[0..73,'A'..'Z'] of boolean; 4 number:array['A'..'Z'] of integer; 5 max:longint; 6 procedure init; 7 var 8 s:
裸的求最近公用祖先,LCA-->RMQ,沒什麼大問題,只不過標號不再完美,需要在深度序列中找最小值,最後再對應回去。View Code 1 rogram pku1330(input,output); 2 type 3 node = ^link; 4 link = record 5 goal : longint; 6 next : node; 7 end; 8 var 9 tree
很老的一個連線不相交問題,左邊的點已經有序,直接對右邊的對應座標求最長不降序列即可,資料較大,需要用nlogn的二分法。View Code 1 program pku1631(input,output); 2 var 3 q : array[0..60000] of longint; 4 top : longint; 5 n : longint; 6 a : array[0..50000] of longint; 7 cases :
石頭剪刀布,每個人出什麼已知,你可以決定他們遊戲的順序,有多少人有可能贏分情況:1:對於石頭剪刀布都有的情況,這個值是n 2:對於只有兩種的情況,答案是兩種對抗能贏得那種的人數 3:只有一種的情況,答案是nView Code 1 program pku2232(input,output); 2 var 3 n,i :longint; 4 c,s,f:longint; 5 ss:ansistring; 6 begin 7 while not
有6種面值的貨幣,最小的是1,求出用最少的貨幣數湊成1..100的最少貨幣數,輸出其中的最大值和他們的平均值。而可以用減法。例如:6=1+2+3,6=7-1,那麼湊成6的最小貨幣數為2.是一個沒有下限的背包問題,體積數組開到3000+就可以了(經過實驗了)。View Code 1 program pku1252(input,output); 2 var 3 f : array[-3000..3000] of longint; 4 v : array[1..6
需要一個這樣的資料結構,每次能修改矩陣中的某一個值,還可以查詢某個子矩陣的權值和。二維樹狀數組沒壓力啊。View Code 1 program pku1195(input,output); 2 var 3 c : array[0..1500,0..1500] of int64; 4 n,kk : longint; 5 function lowbit(x: longint ):longint; 6 begin 7 exit(x and (-x)); 8 end; {
有n個火車站,從一個網站到另一個網站的費用C與它們的距離L有關,有3種距離,對應有3種費用。現在求從一個網站S到另一個網站E所需的最小費用。很簡單的DP,難度等價於數字三角形,注意:輸入中起點不一定大於終點View Code 1 program pku2355(input,output); 2 var 3 f :array[0..10010] of longint; 4 d :array[0..10010] of longint; 5 l,c
有一個圓上有n個點,有m個要求,分別是(a,b)表示a與b要聯通,每個點只能和它左右的點連線,問最少連多少個線段(相鄰兩點之間連的一條線算1條線段)。最多要連n-1條線,整個圓上的點都聯通,所以枚舉不連哪一條線段,算出此時最小的線段數即可。算的時候用next[i]記錄i點向後連邊的終點,求和的時候就能很快了。View Code 1 {$inline on} 2 program pku1944(input,output); 3 type 4 node = record 5
有一個倉庫,在時間段[M,E]需要一直被打掃。現在有n頭奶牛來幹這項工作。每頭奶牛都有一個工作時間段[start,final],並且需要付的費用是cost。問題是聘用哪些奶牛能使費用最少?允多頭奶牛在同一時間工作。先把區間按照final升序排列,然後進行DP,考慮到範圍較大,O(L^2)逾時,引入線段樹進行最佳化,將決策的複雜度降到logn。還要輸出-1,WA死了。。。這是我的pku第100題,慶祝啊,激動死了。。View Code 1 program
有一個長度為n(n<=100000)的有序序列,對於Q(Q<=100000)條詢問(x,y)輸出區間[x,y]中出現次數最多的數的次數。用maxl表示包括左端點的最長重複數的個數maxr表示包括右端點的最長重複數的個數sum表示在該區間內重複數的最大個數,那麼就很容易建立線段樹,由兒子節點去求父親節點,具體的規劃式在程式裡很清楚。View Code 1 program pku3368(input,output); 2 type 3 node = record 4
需要這樣一個資料結構,支援如下操作1:插入優先順序為p,編號為k的節點2:查詢優先順序最高的節點,輸出編號並刪除3:查詢優先順序最低的節點,輸出編號並刪除用一顆SBT即可完美解決問題,沒什麼好說的,多說無益~~~View Code 1 program pku3481(input,output); 2 var 3 left,right,key,s,th:array[0..200000] of longint; 4 tot,root:longint; 5