接著前兩篇,還是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,表示測試例項的...