博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 1026: [SCOI2009]windy数
阅读量:7025 次
发布时间:2019-06-28

本文共 1655 字,大约阅读时间需要 5 分钟。

原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1026

题解:

这是个很水的数位dp,令dp[i][j]表示总共i位,第i位是j的方案数。转移就是dp[i][j]+=dp[i-1][k],其中abs(j-k)>=2。然后统计答案的时候瞎比搞搞就好。

代码:

/**************************************************************    Problem: 1026    User: HarryGuo2012    Language: C++    Result: Accepted    Time:0 ms    Memory:1280 kb****************************************************************/ #include
#include
#include
#include
#include
#define MAX_N 100using namespace std; string A,B; typedef long long ll; ll dp[MAX_N][10]; ll work(string s) { memset(dp, 0, sizeof(dp)); reverse(s.begin(), s.end()); int n = s.length(); for (int i = 0; i < 10; i++)dp[0][i] = 1; for (int i = 1; i < n; i++) for (int j = 0; j < 10; j++) { for (int k = 0; k <= j - 2; k++) dp[i][j] += dp[i - 1][k]; for (int k = j + 2; k <= 9; k++) dp[i][j] += dp[i - 1][k]; } ll ans = 0; for (int i = 0; i < n - 1; i++) for (int j = 1; j <= 9; j++)ans += dp[i][j]; for (int i = n - 1; i >= 0; i--) { for (int j = (i == n - 1); j < s[i] - '0'; j++) { if ((i != n - 1) && abs(j - s[i + 1] + '0') < 2)continue; ans += dp[i][j]; } if ((i != n - 1) && abs(s[i] - s[i + 1]) < 2)break; } return ans;} bool check(string s){ for(int i=1;i
<2)return false; return true;} int main() { cin >> A >> B; cout << work(B) - work(A) + (check(A) && check(B)) << endl; return 0;}

 

转载于:https://www.cnblogs.com/HarryGuo2012/p/4847673.html

你可能感兴趣的文章
鱼C扫描器
查看>>
hdu 5720
查看>>
选择区间不相交问题
查看>>
C# FileStream 按大小分段读取文本内容
查看>>
数字电路期末课程设计总结(二) ——超声波测距模块
查看>>
无法连接数据库-----请求失败或者服务器未能及时响应.
查看>>
HDOJ-1002 大数相加
查看>>
Build subversion 1.8 with SSL on OS X Yosemite
查看>>
Array of Pointers 指针数组
查看>>
运用JS设置cookie、读取cookie、删除cookie
查看>>
python 装饰器
查看>>
SQL语句【T-SQL汇总】
查看>>
异步编程
查看>>
《梦断代码》读后感3
查看>>
QT 对项目二次开发 增加类时 遇到LNK 2019 1120 同时出现;C2061 和一堆语法错误
查看>>
JQuery 选择器
查看>>
css学习笔记(2)
查看>>
如何看内核源码
查看>>
Caffe 安装 cannot find -lpython2 错误
查看>>
坑爹的matlab除法
查看>>