1082. 數字遊戲 (數位DP)
題目連結:點此跳轉
題目大意:
科協裡最近很流行數字遊戲。
某人命名了一種不降數,這種數字必須滿足從左到右各位數字呈非下降關係,如 123,446。
現在大家決定玩一個遊戲,指定一個整數閉區間 [a,b],問這個區間內有多少個不降數。
輸入格式
輸入包含多組測試資料。
每組資料佔一行,包含兩個整數 a 和 b。
輸出格式
每行給出一組測試資料的答案,即 [a,b] 之間有多少不降數。
資料範圍
1≤ a ≤ b ≤231−1
解題思路:
f[i][j] 陣列代表著最高位是j並且一共有i位不降數的集合
f[i][j] = f[i-1][j] + f[i-1][j+1] + f[i-1][j+2] +…+ f[i-1][9];
按照數位DP分析步驟: 假設我們當前列舉到第i位,且第i位上的數字是x,那麼現在對於答案的第i位數字j來說,可以填兩類數字:
-
j 取0~x-1 那麼res += f[i+1][j];
-
j 取 x last記錄x,再列舉下一位
Code:
#include<iostream>
#include<vector>
using namespace std;
const int maxn=30;
int f[maxn][maxn];
void init(){ //預處理f陣列
for(int i=0;i<=9;i++) f[1][i]=1;
for(int i=2;i<maxn;i++){
for(int j=0;j<=9;j++){
for(int k=j;k<=9;k++){
f[i][j]+=f[i-1][k];
}
}
}
}
int solve(int n){
if(!n) return 1;
vector<int> nums;
while(n) nums.push_back(n%10),n/=10;
int res=0;
int last=0;
for(int i=nums.size()-1;i>=0;i--){
int x=nums[i];
for(int j=last;j<x;j++){
res+=f[i+1][j]; //(0~i位,一共有i+1位)
}
if(x<last) break;
last=x;
if(!i) res++;
}
return res;
}
int main(){
init();
int a,b;
while(~scanf("%d%d",&a,&b)){
printf("%d\n",solve(b)-solve(a-1));
}
}
相關文章
- [DP] 數位DP
- 數位 dp
- #數位DP 計數問題
- 數位dp - 板子題
- 數位DP小記
- 數字遊戲遊戲
- 猜數字遊戲遊戲
- CodeForces - 628D (數位dp)
- 數位DP 學習筆記筆記
- 學習筆記:數位dp筆記
- 【學習筆記】數位DP筆記
- Shell猜數字遊戲遊戲
- 猜數字小遊戲遊戲
- 【Java】——猜數字遊戲Java遊戲
- BZOJ 2425 [HAOI2010]計數:數位dp + 組合數
- POJ3252Round Numbers(數位dp)
- 演算法隨筆——數位DP演算法
- 歷屆試題 數字遊戲(數學)遊戲
- 誰來拯救數字遊戲?遊戲
- “3%”與“低個位數”,暴雪為什麼要跟網易玩數字遊戲?遊戲
- 使用者猜數字遊戲遊戲
- 填數字遊戲解題機遊戲
- CCG數字遊戲,誰主沉浮?遊戲
- 移掉 K 位數字
- BZOJ 3329 Xorequ:數位dp + 矩陣快速冪矩陣
- 1295 統計位數為偶數的數字
- linux實現猜數字小遊戲Linux遊戲
- 統計位數為偶數的數字(C++)C++
- C#之簡易猜數字遊戲C#遊戲
- LeetCode 299 猜數字遊戲 Java實現LeetCode遊戲Java
- 7-24 猜數字遊戲 (15分)遊戲
- 數字遊戲策劃學習筆記遊戲筆記
- BZOJ3329: Xorequ(二進位制數位dp 矩陣快速冪)矩陣
- JZ-070-數字序列中的某一位數字
- 對十進位制數字的按位輸出,取反,並求其位數
- [筆記]數位dp例題及詳解(更新中)筆記
- 計數類 DP
- SeekTiger數字老虎NFT遊戲系統開發遊戲