数位DP——Luogu3413 SAC#1
来源:互联网 发布:淘宝网汽车坐垫套途观l 编辑:程序博客网 时间:2024/06/04 21:26
题面:Luogu3413
这好像是我写的第一篇数位DP的blog吧。。。
半原创吧,参考的是我的同学lc233的blog:传送门
首先看到这个数据范围和样例就可以知道这题的主体思路了吧。
我们可以定义状态
一开始推的话很简单:
首先回文串嘛>2就好啦
所以我们只要判断2情况
aa或者aba; ——lc233
所以我们只要考虑连续两位的问题就好了。
所以接下来考虑统计答案的问题了。我们发现这个状态会有很多重复,很麻烦。
那么我们把
接下来就是常规数位DP的写法了。。。
#include <cstdio>#include <algorithm>#include <cmath>#include <cstring>#include <iostream>#include <ctime>#include <map>#include <queue>#include <cstdlib>#include <string>#include <climits>#include <set>#include <vector>#define int long longusing namespace std;const int MOD=1e9+7;int f[1010][10][10];//注意这里f定义:这些数中不是萌数的个数,别搞错string l,r;inline int dp(string x){ int l=x.size(),n=0,ans=0; for(int i=0;i<l;i++)n=(n*10+x[i]-'0')%MOD;n=(n==MOD)?0:n+1; for(int i=2;i<l;i++) for(int j=1;j<10;j++) for(int k=0;k<10;k++)(ans+=f[i][j][k])%=MOD; if(l>1)(ans+=10)%=MOD;//0~9 int la=-1,lla=-1;bool flag=1; for(int i=0;i<l-1;i++){ int now=x[i]-'0'; for(int j=0;j<now;j++)if(i!=0||j!=0) for(int k=0;k<10;k++)if(la!=j&&lla!=j&&j!=k&&k!=la)(ans+=f[l-i][j][k])%=MOD; if(now==la||now==lla){flag=0;break;} lla=la;la=now; } if(flag)for(int j=0;j<=x[l-1]-'0';j++)if(j!=la&&j!=lla)ans=(ans==MOD)?0:ans+1; return (n-ans+MOD)%MOD;}//整个统计答案过程不多解释了signed main(){ ios::sync_with_stdio(0); for(int i=2;i<=1000;i++) for(int j=0;j<10;j++) for(int k=0;k<10;k++)if(j!=k){ for(int l=0;l<10;l++)if(j!=l&&k!=l)(f[i][j][k]+=f[i-1][k][l])%=MOD;//如果没有出现回文现象加上去 if(i-1==1)f[i][j][k]=(f[i][j][k]==MOD)?0:f[i][j][k]+1;//从1开始 } cin>>l>>r; int ans=(dp(r)-dp(l)+MOD)%MOD;int L=l.size(); for(int i=1;i<L;i++)if(l[i]==l[i-1]||i>1&&l[i]==l[i-2]){ans++;break;}//上面的差分是l+1~r的,这里把l加上去 cout<<ans<<endl; return 0;}
阅读全文
1 0
- 数位DP——Luogu3413 SAC#1
- hdu3709——数位dp
- hdu4507——数位dp
- hdu3555——Bomb(数位DP)
- 数位DP——HDU2089 不要62
- 数位DP——UESTC1307 windy数
- HDOJ 4389 —— 数位DP
- HDOJ 2089 —— 数位DP
- UESTC 1307 —— 数位DP
- HDOJ 4507 —— 数位DP
- HDU3555——Bomb(数位DP)
- HDU3555——Bomb(数位DP)
- hdu3555——Bomb(数位dp)
- 数位DP——Bomb ( HDU 3555 )
- hdu3555——Bomb(数位dp)
- Lightoj1068——Investigation(数位dp)
- HiHoCoder1033交错和——数位dp
- hdu3652——B-number(数位DP)
- windows10+Python3.6的flask学习笔记
- 从0开始一个React/ES6项目-Webpack初探
- 按位(&,|,^,>>,<<)5个运算符
- BZOJ1613 [Usaco2007 Jan]Running贝茜的晨练计划
- 给初学者的RxJava2.0教程(八)
- 数位DP——Luogu3413 SAC#1
- C++ String Toolkit Library (StrTk)
- I2C设备驱动编写,struct i2c_device_id,struct i2c_driver,i2c_add_driver,i2c_register_board_info
- 读一些博客之后冒出的想法
- 《笨办法学python》加分习题16——我的答案
- HDU
- Leetcode 78. Subsets
- MySql查询分页的几种方式例句
- hud 1298 T9(字典树 + DFS详解)