hdu 1297 递推难题
這題的話,我能玩一年
今天做了很多遞推的題,這題無疑是最復雜的
?
其實可以看出來,2,3,4,5為一類,不妨定義為2型,1,6為一類,定義為1型
規定num[i]為結尾是i的凹槽的數量
我們可以能輕易的推出 sum = num[1]*2+num[2]*4
?
現在我們開始分析這個遞推式的構成
根據第n個凹槽前 能不能構成一把lock,我們將情況分為兩類
?
A:能構成lock
1.如果當前結尾為1類,我們用‘1’分析好了(下面也是用1),n-1的結尾必然不能是‘6’,因為1和6不能直接相連,根據題意就知道了,可以推出num1[i] = lock[i-1] - num1[i-1]
2.如果當前結尾為2類,那和n-1的結尾無任何關系,則num2[i] = lock[i-1]
?
B:加入n后才能構成lock
很容易推出前n-1應該有兩種種類,因為題目說了至少有三種種類的凹槽
?
1.如果當前結尾是‘1’(1類),我們要分兩種討論,有‘6’和無'6',至于原因,還是因為‘6’不能放在n-1結尾處
a.取‘6’
(哎,數學符號打不出來額,文字描述好了)
從剩下的4個內取1個,組合數為4,排列數為(2^(n-2)-1) ?因為n-1處不能放‘6’
b.不取‘6’
從剩下的4個內取兩個,組合數為為6,排列數為(2^(n-1)-2)
?
2.如果當前是‘2’(2類)
從剩下的5個內取兩個,但是1和6不能同時取,所以-1,則組合數為9,排列數為(2^(n-1)-2)
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm>using namespace std;int main() {__int64 lock[26],num1[26],num2[26];__int64 t;num1[3] = 16;num2[3] = 18;lock[3] = 104;t = num1[3];for(int i=4;i<26;i++){num1[i] = lock[i-1] - t; //sub num6[i-1]num2[i] = lock[i-1];num1[i] += 4*((int)pow((float)2,i-2)-1)+6*((int)pow((float)2,i-1)-2);num2[i] += 9*((int)pow((float)2,i-1)-2);lock[i] = 2*num1[i] + 4*num2[i];t = num1[i];}for(int i=3;i<26;i++){printf("N=%d: %I64d\n",i,lock[i]);}//cout << "Hello world!" << endl;return 0; } View Code
?
轉載于:https://www.cnblogs.com/EdsonLin/p/5342924.html
總結
以上是生活随笔為你收集整理的hdu 1297 递推难题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Bugtags 2016-06-16 更
- 下一篇: FileInputStream 把文件