hdu 3555 含有49的數 數字dp

2021-07-10 11:25:00 字數 1304 閱讀 1907

題目:

題意:給定任意n,計算從1~n中有多少數包含49

分析:今天看到群裡有個人問這道題,我就做了一下,dfs就搞定了。。看了一下題解,大部分是遞推,找規律求解。但是做題還是dfs

#include#includeusing namespace std;

typedef long long ll;

ll f[20][3]; //依次表示當前位不是4且不含49,是4,有了49.這三個狀態

int s[20];

ll dfs(int pos,int is,bool lim)

if(!lim)f[pos][is]=ans;

return ans;

}int main()

// for(int i=0;i<=len;i++)cout<

遞推:偷點懶,copy點別人寫的:

dp[i][0]=dp[i-1][0]*10-dp[i-1][1];                         //代表不含49 (當位數增加一位,不含49的數增加10倍,但是要減去乙個以9開頭的)

dp[i][1]=dp[i-1][0];                                             //代表不含49,但以9開頭(當位數增加一位,就增長了在原來不以9開頭的那些)

dp[i][2]=dp[i-1][2]*10+dp[i-1][1];                       //代表包含49(當位數增加一位,之前已經包含49的增加10倍,另外要加上現在開頭為4和之前開頭為9組合成49的數)

當然狀態轉移方程不止這一種,如:

dp[k][0]=dp[k-1][0]*9+dp[k-1][1]*8;                   //dp[0]表示不包含49並且以非4結尾的個數

dp[k][1]=dp[k-1][0]+dp[k-1][1];                          //dp[1]表示不包含49並且以4結尾的個數

dp[k][2]=dp[k-1][1]+dp[k-1][2]*10;                     //dp[2]表示包含49的個數

#include#includeusing namespace std;

typedef long long ll;

ll f[20][3];

int s[20];

void init()

}int main()

bool flag=0;

ll ans=0;

s[len+1]=0;

for(int i=len;i>0;i--)

cout<

hdu 3555 數字dp入門

題意 給定乙個long long型別能夠存下的數字n,統計1 n之間含有49的數字的個數 思路 初始版本 需要記錄當前位置,前一位置放了那個數字,當前是否已經包含49,是否有上界這四個資訊,也就是dfs的四個引數。dfs pos,pre,istrue,limit 其實這種做法有點相當於把普通的數字d...

hdu3555 數字dp 入門

題目大意 給乙個數字n,範圍在1 2 63 1,求1 n之間含有49的數字有多少個。思路 狀態轉移 dp i 0 代表長度為 i 並且不含有49的數字的個數 dp i 1 代表長度為 i 並且不含有49,但是最高位是9的數字的個數 dp i 2 代表長度為 i 並且含有49的數字的個數。陣列 a i...

數字dp學習小記 Hdu 3555

幾個基礎數字dp hdu 2089,hdu 3555 uestc 1307 windy 數 窩是愛醬,喵 部落格頻道 csdn.net 專題 數字dp 按位dp cmonkey 部落格頻道 csdn.net 總結 數字統計模板 暁美 參照網上各位大牛的 總算是理解了演算法的思想,debug一下午之後...