首页 > 代码库 > hdu 2089 不要62 (数位dp)
hdu 2089 不要62 (数位dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089
思路:用变量记录吉利数,和最高位为2的吉利数还有不是吉利数的个数。。。
code:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int dp[10][3]; //dp[i][j] ,i表示位数,j表示状态<pre name="code" class="cpp"><span style="font-family: Arial, Helvetica, sans-serif;">//dp[i][0],表示不存在不吉利数字</span>
<span style="font-family: Arial, Helvetica, sans-serif;">//dp[i][1],表示不存在不吉利数字,且最高位为2</span>
<span style="font-family: Arial, Helvetica, sans-serif;">//dp[i][2],表示存在不吉利数字</span>
<span style="font-family: Arial, Helvetica, sans-serif;">void Init()</span>
<span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name="code" class="cpp">{ memset(dp,0,sizeof(dp)); int i; dp[0][0]=1; for(i=1;i<=6;i++) { dp[i][0]=dp[i-1][0]*9-dp[i-1][1]; //本来应该乘以10的,但是要4不符合条件,所以就乘以9,还有就是要把第i位为6,i-1位为2的减去 dp[i][1]=dp[i-1][0]; //开头只放2 dp[i][2]=dp[i-1][2]*10+dp[i-1][0]+dp[i-1][1]; } } int solve(int n) { int i,len=0,tem=n,ans,flag,a[10]; while(n) { a[++len]=n%10; n/=10; } a[len+1]=ans=0; flag=0; for(i=len;i>0;i--) { ans+=dp[i-1][2]*a[i]; if(flag) //当到某位时,已经确定为不是吉利数啦 { ans+=dp[i-1][0]*a[i]; } if(!flag&&a[i]>4) { ans+=dp[i-1][0]; } if(!flag&&a[i+1]==6&&a[i]>2) { ans+=dp[i][1]; } if(!flag&&a[i]>6) { ans+=dp[i-1][1]; } if(a[i]==4||(a[i+1]==6&&a[i]==2)) { flag=1; } } return tem-ans; //因为题目要求的是吉利数的个数,所以就用总数减去非吉利数 } int main() { int l,r; Init(); while(scanf("%d%d",&l,&r)==2) { if(l==0&&r==0) break; printf("%d\n",solve(r+1)-solve(l));//因为在solv()函数中没有对n进行判断是否为吉利数,所以要加1. } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。