題目:
首先,多種方案的出現是因為乙個較大的斐波那契數可以變成兩個較小的;
用乙個01串來表示這個數的斐波那契數情況,1表示有這個斐波那契數,0表示沒有;
所以首先盡量把這個數往大的斐波那契數來分,作為dp的初始狀態;
記錄乙個陣列p,表示每個斐波那契數在這個01串裡的位置;
考慮對於乙個數選或不選:若選則沒有什麼影響,把之前的狀態加起來即可;
若不選,則考慮它往前拆,還需看看前乙個斐波那契數是否選了;
這是就用到了p陣列,就像字首和一樣,可以算出兩個斐波那契數之間有多少個0。
**如下:
#include#include#include
#include
using
namespace
std;
typedef
long
long
ll;ll n,f[
105],dp[105][3
],cnt,m;
int p[105
];int
main()
for(;cnt;cnt--)
if(f[cnt]<=n)p[++m]=cnt,n-=f[cnt];
sort(p+1,p+m+1);//
dp[1][0]=(p[1]-1)/2;dp[1][1]=1
;
for(int i=2;i<=m;i++)
printf(
"%lld
",dp[m][0]+dp[m][1
]);
return0;
}
統計出現最多的數字
題目描述 輸入乙個長度小於等於256 大於0 且只包含數字的字串,統計其中出現最多數字的個數。若有多個數字的個數並列最多,取最先出現的數字。輸出該數字及個數做成的字串,格式 數字 逗號 個數 輸入輸入乙個長度小於等於256 大於0 且只包含數字的字串 輸出 輸出該數字及個數做成的字串,格式 數字 逗...
統計出現最多的數字
輸入乙個長度小於等於256,大於0,且只包含數字的字串,統計其中出現最多數字的個數。若有多個數字的個數並列最多,取最先出現的數字。輸出該數字及個數做成的字串,格式 數字 逗號 個數 輸入 輸入乙個長度小於等於256,大於0,且只包含數字的字串 輸出 輸出該數字及個數做成的字串,格式 數字 逗號 個數...
2017 10 22 最多的方案 失敗總結
老想著數表結合的方法,結果就是找不到規律。這個題看起來好像是乙個函式就可以做,但其實不是的,斐波那契函式有很好的形勢 f i f i 1 f i 2 他可以看成兩個點轉移到乙個點,也可以看成乙個點拆成兩個點,所以就按照拆分dp就可以了 f 位數 是否越界乙個1 碼 include includeus...