【数位DP】B-number(HDU 3652)
生活随笔
收集整理的這篇文章主要介紹了
【数位DP】B-number(HDU 3652)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
B-number
HDU 3652
題目大意:
有一個數n,求出1~n中含‘13’且能被13整除的數有多少個
輸入樣例
13 100 200 1000輸出樣例
1 1 2 2解題思路:
用數位DP枚舉完每一位,同事也判斷題目要求的條件
數據范圍:
1 <= n <= 1000000000
代碼:
#include<cstdio> #include<cstring> #include<iostream> using namespace std; int n,tot,s[50],a[50][5][20]; int js(int dep,int tt,int number,bool yw)//dep表示第幾位,tt表示是否有13,number表示除以13后的余數,yw代表是否到頂了 {int num,ans;if (dep<=0) return tt==2&&!number;if (!yw&&a[dep][tt][number]) return a[dep][tt][number];//記憶化num= yw?s[dep]:9;//到頂了就不能過大ans=0;for (int i=0;i<=num;++i)if (tt==1&&i==3||tt==2) ans+=js(dep-1,2,(number*10+i)%13,yw&&i==num);//有13的else if (i==1) ans+=js(dep-1,1,(number*10+i)%13,yw&&i==num);//有一個1,下一次加3即可else ans+=js(dep-1,0,(number*10+i)%13,yw&&i==num);//其他情況if (!yw) a[dep][tt][number]=ans;//記錄return ans; } int main() {while (~scanf("%d",&n)){memset(a,0,sizeof(a));memset(s,0,sizeof(s));tot=0;while (n) s[++tot]=n%10,n/=10;//二進制化printf("%d\n",js(tot,0,0,1));//輸出} }總結
以上是生活随笔為你收集整理的【数位DP】B-number(HDU 3652)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 秋后的蚂蚱是什么意思 秋后的蚂蚱解析
- 下一篇: 【线段树】开关(luogu 3870)