1. 程式人生 > >【數位DP】題集

【數位DP】題集

狀態 轉移 位置 長度 數位 一次 是否 php 統計

1.HDOJ2089
題意:求區間內不出現4和62的數的個數
解法:模板題

2.HDOJ3555
題意:求區間內不出現49的數的個數
解法:模板題

3.HDOJ5179
題意:對於一個十進制數,把每一位拆出來變成一個數組,要求數組右邊的數都小於等於左邊的數,且左數能整除右數。求區間內滿足條件的個數
解法:dp[i=20][j=10]: j為前一位上的數
按要求轉移即可,要考慮前導零,註意防止%0的情況出現

4.HDOJ3652
題意:求區間內含13或者是13倍數的數的個數
解法:dp[i=20][j=13][k=3]: j為對13的余數,k為狀態(0: 前一位不是1 | 1: 前一位是1 | 2: 前面出現過13)
最後當j為0,k為2時加入計數,計算不含13並且不是13倍數的數
輸出時為{N+1-solve(N)}

(0也在統計內)

5.HDOJ3709
題意:定義平衡數,以某一數位作為原點,左邊數位上{數字 × 距離}之和與右邊數位上的相等。求區間內平衡數的個數
解法:dp[i=20][j=5000][k=20]: j為左邊數位權值之和,k為枚舉的原點
需要枚舉原點,然後統計左邊權值的減去右邊的權值最後是否為零,由於 0 對於每個枚舉位置都會被統計,最後要再減去{枚舉次數 - 1}個重復的0

6.HDOJ6148
題意:對於一個十進制數,要求從左到右的數位沒有出現先遞增接著遞減的情況,求區間內滿足條件的個數
解法:dp[i=105][j=10][k=2]: j為前一個數,k表示前面是否已出現遞增
按要求轉移即可,要考慮前導零,這題的0是不合法的,額外減1就行了,註意數據範圍10^100

7.HDOJ5898
題意:對於一個十進制數,要求數位中奇數段長度都為偶數,偶數段長度都為奇數,求區間內滿足條件的個數
解法:dp[i=20][j=10][k=20]: j為前一個數,k為前一個數所屬段的長度
要考慮前導零,轉移時,當前數位若與前一位奇偶相反,表示前一段已結束,判斷長度是否滿足要求剪枝,並重置k為1繼續向下枚舉,最後統計時還要再判斷一次j與k,奇偶相反則加入統計

【數位DP】題集