數字dp學習小記 Hdu 3555

2021-06-13 12:26:57 字數 1250 閱讀 8148

幾個基礎數字dp (hdu 2089,hdu 3555 ,uestc 1307 windy 數) - 窩是愛醬,喵~~~~ - 部落格頻道 - csdn.net

【專題】數字dp(按位dp) - cmonkey - 部落格頻道 - csdn.net

[總結]數字統計模板 - 暁美ほむら -

參照網上各位大牛的**,總算是理解了演算法的思想,debug一下午之後終於過了第一道數字dp題……

用了兩種方法:遞推和遞迴。

遞推

#include #include __int64 dp[21][3],n;

int len,bit[21];

//dp[i][0]表示長度為i,沒有49

//dp[i][1]表示長度為i,沒有49但是開頭為9的個數

//dp[i][2]表示長度為i,包括49的個數

void init ()

}int main ()

bit[len+1]=0;

__int64 ans=0;

bool flag=false;

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

printf("%i64d\n",ans);

}return 0;

}

遞迴

#include #include int bit[25];

__int64 dp[25][3];

//dp[i][0]表示長度為i,沒有49

//dp[i][1]表示長度為i,沒有49但前一位為4

//dp[i][2]表示長度為i,包括49的個數

/*limit表示是否有上限,比如n=1234,現在轉移到12,如果下一位選3,那麼再下一位就有上限,

上限為4,如果不選3,那麼下一位就沒限制,最高位9,轉移能保證轉移到數比n小*/

__int64 dfs (int pos,int s,bool limit) //s為之前數字的狀態

//limit==true則說明有限制,即所有可能並沒有被全部記錄,故此時記入dp陣列

//limit==false則說明之後的分支狀態已經搜尋完全

return limit?ans:dp[pos][s]=ans;

}int main ()

printf("%i64d\n",dfs(len-1,0,1));

} return 0;

}

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...

hdu 3555數字DP 入門題

include include include include include include include include include include includeusing namespace std typedef long long ll define inf 0x3f3f3f3f ...