中山大學保研機試的一道題
阿新 • • 發佈:2019-02-05
數位dp
題意:
你有2張1塊錢,2塊錢,4塊錢...2^k塊錢.
現在你要交n塊錢,問有多少種交法
PS:1+2+1,1+1+2算同一種交法
資料範圍:
n<=2^63,k是任意大的
思路:
應該是挺經典的數位dp吧,雖然我現場想不出.
從低位往高位考慮,為什麼?
因為高位的鈔票不能影響低位的值,而低位可以通過進位影響高位.
對於某個位來說,實際上有12種情況,分別是:
1.拿0張,1張,2張鈔票
2.進位與不進位
3.該位是0或者是1
dp[i][j],i表示第i位,j表示該位是否向高位進位.
該位為1時:
dp[i][0]=dp[i-1][1]+dp[i-1][0] (不進位,該位為1[1]:前一位進位+拿0張[1+0],前一位不進位+拿1張[0+1])
dp[i][1]=dp[i-1][1] (進位,該位為1[3]:1+2)
該位為0時:
dp[i][0]=dp[i-1][0] (0:0+0)
dp[i][1]=dp[i-1][1]+dp[i-1][0] (2:1+1,0+2)
初始化dp[0][0]和dp[0][1]的時候,對應上述公式,去掉前一位進位的情況即可.
最後答案是dp[k][0],k是n的最高位,j=0表示沒有進位,也就是n這個數的答案.
總結:
數位dp,dp[i][j],i表示第i位,j表示該位是否向高位進位.