杭電60道DP問題總結(三)

2021-06-15 09:08:26 字數 2576 閱讀 7783

接著前兩篇,還是5道一貼吧。

proid 1159  common subsequence

題目意思很簡單,是個最基本的dp,任何一本演算法書都會講這個題目,最長公共子串行。

狀態轉移方程,dp[i][j]=dp[i-1][j-1]+1(when str[i]==str[j])  max(dp[i-1][j],dp[i][j-1])(when str[i]!=str[j])

就不解釋了,直接上**:

#include#include#include#includeusing namespace std;

char s1[2000],s2[2000];

int dp[2000][2000];

int main()

return 0;

}

proid 1160   fatmouse's speed

題目大意是,讓你證明一下肥的老鼠跑的慢(直接翻譯),其實就是求乙個最長上公升子串行問題,要找的就是在重量從小到大的乙個序列中,找乙個最長的序列,其中這個序列中的元素速度是遞減的。這也算是乙個比較經典的問題了,就不再多說了,最早的那篇中對最長上公升子串行有詳細解釋。

**如下:

#include #include #include #include #includeusing namespace std;

struct data

;data data[1001];

bool com(data d1,data d2)

}printf("%d\n",tmp);

vectorvec;

while(memory[ind]!=ind)

vec.push_back(data[ind].index);

for(int i=vec.size()-1;i>=0;i--)

printf("%d\n",vec[i]);

return 0;

}

proid  1165    eddy's research ii

看題目應該是有個同樣的題目吧,不然為什麼會有個ii呢。題目意思很簡單,就是求解乙個遞迴式,其實算不上是乙個dp問題,題目放到這裡或許有點問題吧,那就強制性的用用dp唄,其實就是乙個方程式化簡問題。化簡過程就不寫出來了,在紙上畫畫就明顯能看出來,

這段**是摘錄題目後邊的discuss中乙個同學的,因為看起來比較像dp,參考下吧。

#includeint dp[4][1000005];

int main ()

return 0;

}

proid 1176  免費餡餅

題目意思是,你站在一條路上的中間位置,這條路有11個點組成的,在某一秒種會有餡餅掉落,你可以在一秒內移動到兩邊的某乙個位置上, 在當前位置上可以接到包括當前位置以及兩邊位置的餡餅。簡單來說比如我站在5點,那麼可以在1s內接到4,5,6其中的某乙個點落下的餡餅。因為每次只能向左右移動,其實就是乙個數塔的變形。普通的數塔是向左下或右下走。

狀態轉移方程:

dp[i][j]=max(dp[i+1][j-1],dp[i+1][j],dp[i+1][j+1])+data[i][j] 

解釋一下,dp[i][j]表示從第i秒到第max秒在位置j上所收穫的最多的餡餅,就是由第i+1秒到第max秒所獲得的最多的餡餅,注意了,一定是從下往上算,一開始我也弄錯了,算了半天總是結果不對,

普通數塔是從上往下算(當然從下往上算也可以),是因為要求的最終結果在最下邊一層,而且需要多一次最終的遍歷,以找到最大值,本題目需要從下往上算是因為需要的最後最終結果在最頂層。

【不過個人覺得應該從上往下算也可以,但是實際做的時候卻總是得不到正確的結果,哪位大神知道怎麼做的話可否給點提示】

**如下:

#include #include #include #include using namespace std;

#define n 100005

int dp[n][11];

int main()

printf("%d\n",dp[0][5]);

}return 0;

}

proid 1176 i need a offer

題目大意是,某個人有n快錢,向m個學校申請offer,告訴申請每個學校的資金和概率,求出至少拿到乙份offer的概率。說白了就是個01揹包問題,m個物品,總的揹包重量是n,每裝乙個物品,所占用的揹包重量是資金,收穫的價值是獲得offer的概率。對應起來直接套公式就可以了。

注意了,是求得至少獲得乙個offer的概率,因此需要使用全概率公式,儲存的時候儲存都不能獲得offer的概率。

**如下:

#include #include #include #include using namespace std;

int a[10005];

double b[10005],dp[10005];

int main()

return 0;

}

杭電2014 2020總結

昨天天氣不太好,一整天都沒有陽光,導致我的心情也有點鬱悶,沒有把昨天本該做的題做完,該寫的部落格寫完,就把任務拖到了今天了。2014 本題需要用到累加和遍歷求極值的技巧。用大一時王sir的話說,就是開設乙個 擂台 遍歷一遍資料,誰最 極 的,誰就登上擂台。如果要求記錄極值的位置,還需要在開設乙個記錄...

杭電2028 2032總結

本次練習是c語言程式設計練習的最後一套。2028 本題的核心是編寫乙個求最大公約數的函式 利用歐幾里得演算法 求得了兩個數的最大公約數,就可以求得兩個數的最小公倍數。多個數的最小公倍數,利用如下原理求得,求a1,a2.an 的最小公倍數,令n是 a1,a2.an 1 的最小公倍數,則要求的最小公倍數...

杭電2041 2044 2046總結

有一樓梯共m級,剛開始時你在第一級,若每次只能跨上一級或二級,要走上第m級,共有多少種走法?輸入資料首先包含乙個整數n,表示測試例項的個數,然後是n行資料,每行包含乙個整數m 1 m 40 表示樓梯的級數 對於每個測試例項,請輸出不同走法的數量 2044 輸入資料的第一行是乙個整數n,表示測試例項的...