【hdu2089】不要62
生活随笔
收集整理的這篇文章主要介紹了
【hdu2089】不要62
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
驚奇地發(fā)現(xiàn)今天居然和dalao的題單重了不少23333333333333
這是我第一次做數(shù)位dp,感覺這個(gè)題目還是比較茲磁的
#include<iostream> #include<cstring> #include<cstdio> using namespace std; int l,r,dp[20][15],a[20]; int dfs(int pos,int las,int fl,bool flag)//pos是當(dāng)前位置,las是上次選的那個(gè)數(shù),fl判斷上次選的數(shù)是否為6,flag判斷pos位上是否有枚舉限制 {if(pos==0)//答案成立,返回1 return 1;if(!flag&&dp[pos][las]!=-1)//如果flag==1的時(shí)候也返回,那么像213的時(shí)候會(huì)使答案偏大 return dp[pos][las];int ding=(flag)?a[pos]:9;//判斷這一位上是否有限制最大能枚舉的數(shù) int re=0;for(int i=0;i<=ding;i++){if(i==4||(las==6&&i==2))//不能出現(xiàn)4或者62 continue;re+=dfs(pos-1,i,i==6,flag&&i==a[pos]);}if(!flag)//如果flag==1說明這一位有限制,并不完全將第pos位上一次選的las的狀態(tài)完全包含,所以不能賦值 dp[pos][las]=re;return re; } int solve(int x) {int pos=0;while(x>0)//先拆分成一位位的數(shù)字 a[++pos]=x%10,x/=10;return dfs(pos,-1,0,1);//flag初始設(shè)為0是因?yàn)閿?shù)位長(zhǎng)度+1位確實(shí)是0 } int main() {memset(dp,-1,sizeof(dp));//每次輸入的只是不同的數(shù)據(jù)范圍,但是不會(huì)影響dp數(shù)組的答案,所以只初始化一遍就好 while(~scanf("%d%d",&l,&r)){if(l==0&&r==0)break;printf("%d\n",solve(r)-solve(l-1));//l也被包含在答案區(qū)間一部分 } }?
轉(zhuǎn)載于:https://www.cnblogs.com/Loi-dfkdsmbd/articles/7732564.html
總結(jié)
以上是生活随笔為你收集整理的【hdu2089】不要62的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (十九)java多线程之ForkJoin
- 下一篇: win7如何启用计算机的无线功能,win