欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

POJ1496-Word Index

系統 1977 0

轉載請注明出處:優 YoU ? http://user.qzone.qq.com/289065406/blog/1301474058

大致題意:(與 POJ1850 基本一致)

輸出某個 str 字符串在字典中的位置,由于字典是從 a=1 開始的,因此 str 的位置值就是 str 前面所有字符串的個數 +1

規定輸入的字符串必須是升序排列。不降序列是非法字符串

要求用循環輸入,輸入若干組字符串,若輸入非法字符串則輸出 0 ,但不結束程序,這是和 POJ1850 最猥瑣的區別,很多同學只注意到規定 str 的長度不同,以為把 str 數組長度改一下直接復制就能 AC 拿下一題了,殊不知老是 WA 卻找不到原因,大概就是這里出問題了

本題 Str 最長為 5 個字符

?

解題思路:

組合數學題,不知道為什么會被歸類到遞推數學,可能是因為楊輝三角和組合數之間的關系。。。

?

第一步當然首先判斷輸入的 str 是否是升序序列

?

若符合第一步,則首先計算比 str 長度少的所有字符串個數

假設 str vwxyz ,則其長度為 5

那么

POJ1496-Word Index

?

? 然后就是關鍵了,長度為 2 的字符串,根據開頭字母不同,就有 25 種不同情況,編程去處理是很困難的。這里必須要用數學方法去處理。

POJ1496-Word Index


POJ1496-Word Index

?

所以用一個簡單的循環就能計算出 str 長度少的所有字符串個數 了,這就是數學的威力,把受限的取法轉換為不限制的取法

?

?

第三步,就是求長度等于 str ,但值比 str 小的字符串個數

這個看我程序的注釋更容易懂,所以這里就不再啰嗦了,值得注意的是這步我同樣利用了公式( 1 , 所以如果看到某些地方取字母的時候看上去好像沒有遵守“升序規則”,本來要限制取字母的地方卻沒有限制,那一定是用公式( 1 )變換了

?

第四步,把前面找到的所有字符串的個數之和再 +1 ,就是 str 的值

之所以 +1 ,是因為此前的所有操作都只是找 str 之前的字符串,并不包括 str 本身

?

然后到了最后,剩下一個問題就是怎樣得到每一個 的值,這個我發現很多同學都是利用打表做的, 利用的就是 組合數 楊輝三角 的關系 (建立一個二維數組 C[n]

--

就能看到他們之間關系密切啊!區別就是頂點的值,楊輝三角為 1 ,組合數為 0

其實這個“關系”是有數學公式的

POJ1496-Word Index


?

其實組合數也可以直接用計算方法做 (n 的規模可以至少擴展到 1000) ,不過這里 n 的規模只有 26 ,打表應該是更快的,有興趣學習用計算方法做組合數的同學可以聯系我,這個要用另外的數學方法處理。

QQ289065406 ??? O( _ )O 哈哈 ~

?

?

最終感想:必須要知道關于組合數 nCm 的公式才能很簡單解這題的,特別是公式( 1 ),會害死一堆人的。。。。。。。初級的數學題就這么難了,感概某些大牛說:水題一道! Orz

?

?

      
         1
      
      
        //
      
      
        Memory Time 
        
2 // 208K 0MS
3
4 #include < iostream >
5 #include < string >
6 using namespace std;
7
8 int c[ 27 ][ 27 ] = { 0 };
9
10 /* 打表,利用楊輝三角計算每一個組合數nCm */
11
12 void play_table( void )
13 {
14 for ( int i = 0 ;i <= 26 ;i ++ )
15 for ( int j = 0 ;j <= i;j ++ )
16 if ( ! j || i == j)
17 c[i][j] = 1 ;
18 else
19 c[i][j] = c[i - 1 ][j - 1 ] + c[i - 1 ][j];
20 c[ 0 ][ 0 ] = 0 ;
21 return ;
22 }
23
24 int main( int i, int j)
25 {
26 play_table();
27
28 char str[ 6 ];
29 while (cin >> str)
30 {
31 int len = strlen(str);
32
33 /* 檢查str是否符合升序排列 */
34
35 bool flag = false ;
36 for (i = 1 ;i < len;i ++ )
37 if (str[i - 1 ] >= str[i])
38 {
39 cout << 0 << endl;
40 flag = true ; // 本題要求循環輸入多組str
41 } // 而且即使str不符合字典要求(如aab,ba等)也不能結束輸入循環
42 // 只有當程序結束時輸入才終止,這是與POJ1850的最隱蔽區別
43
44 if ( ! flag)
45 {
46 int sum = 0 ; // str的值,初始為0
47
48 /* 計算長度比str小的字符串個數 */
49
50 for (i = 1 ;i < len;i ++ )
51 sum += c[ 26 ][i]; // c[26][i]表示 長度為i的字符串的個數
52
53 /* 計算長度等于len,但值比str小的字符串個數 */
54
55 for (i = 0 ;i < len;i ++ ) // i為str的指針,對每一個位置枚舉 允許選擇的字符ch
56 {
57 char ch = ( ! i) ? ' a ' :str[i - 1 ] + 1 ; // ch = str[i-1]+1 根據升序規則,當前位置的ch至少要比str前一位置的字符大1
58 while (ch <= str[i] - 1 ) // ch<=str[i]-1 根據升序規則,當前位置的ch最多只能比 str這個位置實際上的字符 小1
59 {
60 sum += c[ ' z ' - ch][len - 1 - i]; // 'z'-ch : 小于等于ch的字符不允許再被選擇,所以當前能夠選擇的字符總數為'z'-ch
61 ch ++ ; // len-1-i : ch位置后面(不包括ch)剩下的位數,就是從'z'-ch選擇len-1-i個字符
62 }
63 }
64
65 cout <<++ sum << endl; // 此前的操作都是尋找比str小的所有字符串的個數,并不包括str本身,因此這里要+1
66 }
67 }
68 return 0 ;
69 }

POJ1496-Word Index


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久草这里只有精品 | 在线黄色毛片 | 国产人成精品一区二区三 | 91福利国产在线观看网站 | 天天摸天天碰成人免费视频 | 人人射人人爱 | 日韩av电影免费看 | 奇米奇米色 | 日本精品久久久久护士 | 久久亚洲精品国产亚洲老地址 | 国产福利一区二区在线精品 | 欧美艹逼 | 伊人青青操 | 久久精品一区二区三区四区 | 神马电影网午夜 | 欧美精品一区二区免费 | a级在线观看 | 欧美激情第二页 | 成年人在线观看 | 日本午夜在线观看 | 好爽~好硬~好紧~蜜芽 | 日韩中文字幕一区 | 国产福利视频 | 国产成人羞羞视频在线 | 国产精品综合网 | 国产精品k | 亚洲精品国产第一区二区多人 | 草久久久 | 久草在线资源视频 | 特黄免费 | 国产一区www | 亚洲一区黄色 | 人人看人人干 | 天天操天天射天天插 | 久久久久九九九九 | 99pao成人国产永久免费视频 | 欧美精品18 | 亚洲无线一二三四手机 | 国产成人精品高清免费 | 青春草在线观看 | 精品久久久久久久人人人人传媒 |