当前位置: 首页 > news >正文

HDU 5898 数位DP

题意: 求满足数位上连续的奇数为偶数个,连续的偶数为奇数个的数的个数。
思路: 典型的数位DP,dp[i][p][l]一维表示数位第i位,二维表示上一位的奇偶性,三维表示在第i位之前保持上一位的奇偶性的长度的奇偶性。

我的第一层传入的p和l为1,0。因为0个奇数是满足偶数个奇数的性质的,即数位上只有奇数个偶数的的数是满足条件的。


#include <iostream>
#include <string.h>
#include <cstdio>
#define LL long long
using namespace std;
int wei[30];
LL dp[30][2][2];	//后两维仅用来判断奇偶足够 
LL dfs(int pos, int limit, int lead, int p, int l)
{
	if(pos == -1)
	{
		if(lead) return 1;			
		//都是前导零即0满足,没这句也是可以的。如果前面所有的位都是前导零的话, 
		//传到pos=-1位p=1,l=0正好是满足偶数个奇数的性质的,其实0本身就是这性质 
		if(p && !(l&1)) return 1;	
		if(!p && (l&1)) return 1;
		return 0;
	}
	if(!lead && !limit && dp[pos][p][l&1] != -1) return dp[pos][p][l&1];
	int up = limit? wei[pos]: 9; LL res = 0;
	for(int i = 0; i <= up; ++i)
	{
		//pos位之前都是前导零,所以不会致使l增长,也会保持pos位前是偶数个奇数的特质
		if(lead && i==0)
		{ 
			res += dfs(pos-1, limit&&i==wei[pos], 1, 1, 0);
			continue;
		}
		//前面是奇数且i是奇数,所以直接可往后走 
		if(p && (i&1)) 
		res += dfs(pos-1, limit&&i==wei[pos], lead&&i==0, 1, l+1);
		
		//前面是奇数而i变为偶数,只有满足前面为偶数个奇数才能往后走 
		if(p && !(l&1) && !(i&1)) 
		res += dfs(pos-1, limit&&i==wei[pos], lead&&i==0, 0, 1);
		
		//前面是偶数且i是偶数,所以直接可往后走 
		if(!p && !(i&1)) 
		res += dfs(pos-1, limit&&i==wei[pos], lead&&i==0, 0, l+1);
		
		//前面是偶数而i变为奇数,只有满足前面为奇数个偶数才能往后走 
		if(!p && (l&1) && (i&1)) 
		res += dfs(pos-1, limit&&i==wei[pos], lead&&i==0, 1, 1);
		
	}
	if(!lead && !limit && dp[pos][p][l&1] == -1) dp[pos][p][l&1] = res;
	return res;
}
LL solve(LL k)
{
	if(k == 0) return 1;
	int cnt = 0;
	while(k)
	{
		wei[cnt++] = k%10;
		k /= 10;
	}
	return dfs(cnt-1, 1, 1, 1, 0);
}
int main()
{
	int t;
	LL l, r;
	memset(dp, -1, sizeof dp);
	scanf("%d", &t);
	for(int i = 1; i <= t; ++i)
	{
		scanf("%lld %lld", &l, &r);
		printf("Case #%d: %lld\n", i, solve(r)-solve(l-1));
	}
	return 0;
}

继续加油~

相关文章:

  • topas解析(AIX)
  • Tarjan算法 模板
  • SQL应用与开发:(六)函数和表达式的使用
  • QDU 帅气的HYC求乘积
  • Android学习初感觉
  • KM算法模板(二分图的最大权匹配)
  • 《社交红利》读书总结--如何从微信微博QQ空间等社交网络带走海量用户、流量与收入...
  • 三分法求凸性函数极大极小值
  • CodeForces 612D
  • 【leetcode】Factorial Trailing Zeroes(easy)
  • 数学知识小记
  • [SQL]mysql密码读取
  • CodeForces 616E(数学规律)
  • MongoDB aggregate 运用篇(转)
  • 二分图的概念汇总
  • [译]如何构建服务器端web组件,为何要构建?
  • “大数据应用场景”之隔壁老王(连载四)
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 《剑指offer》分解让复杂问题更简单
  • 30秒的PHP代码片段(1)数组 - Array
  • ES6系统学习----从Apollo Client看解构赋值
  • Git初体验
  • HTTP 简介
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • javascript面向对象之创建对象
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • Js基础知识(四) - js运行原理与机制
  • Kibana配置logstash,报表一体化
  • laravel5.5 视图共享数据
  • MaxCompute访问TableStore(OTS) 数据
  • MySQL数据库运维之数据恢复
  • Python连接Oracle
  • quasar-framework cnodejs社区
  • REST架构的思考
  • Spring声明式事务管理之一:五大属性分析
  • SpriteKit 技巧之添加背景图片
  • Vue学习第二天
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 分布式任务队列Celery
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 提醒我喝水chrome插件开发指南
  • 我有几个粽子,和一个故事
  • puppet连载22:define用法
  • 湖北分布式智能数据采集方法有哪些?
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • # Maven错误Error executing Maven
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • # 透过事物看本质的能力怎么培养?
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #if #elif #endif
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (全注解开发)学习Spring-MVC的第三天
  • (四)模仿学习-完成后台管理页面查询
  • .apk文件,IIS不支持下载解决