bzoj2660最多的方案 數字DP

2022-05-12 12:14:44 字數 824 閱讀 2721

題目:

首先,多種方案的出現是因為乙個較大的斐波那契數可以變成兩個較小的;

用乙個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...