1. 程式人生 > >中山大學保研機試的一道題

中山大學保研機試的一道題

數位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表示該位是否向高位進位.