zoj 3962 Seven Segment Display(数位dp)
来源:互联网 发布:js unicode转utf8 编辑:程序博客网 时间:2024/06/08 03:02
题意:
一个8位的十六进制的数字电子显示器,显示每个数字对应每秒要消耗多少点能量,数字每秒钟会加1,问初始数字为x,y秒后消耗多少能量。
解题思路:
赛场上去找规律做写炸了。赛后才知道可以数位dp搞,于是决定不看题解写一发。写了一发dp[pos][pre]这种状态的数位,示例也不过了,最后发现符合pos,pre状态的情况,他们pos位之前的能量加和是不一样的,所以答案是错的。最后还是看了题解,用dp[pos][sum],表示第pos位时,前面的能量消耗sum,这样的话就都符合了。之前也想过把之前的能量贡献情况当状态,但是死板的认为还要考虑顺序, 这样的话这个状态没法用数组保存,但是对于这个题目来说,我们不需要知道哪个数字是在哪一位出现的,我们关系的是最后的能量加和,所以当位数相同,能量加和相同,效果就是一样的,后面的答案就可以套用了。
数位dp是有pos-1位转移到pos位,这个 过程利用搜索比较方便,但是再搜索的过程中会有很多状态重复搜索,我们把会重复的这些状态找出来,进行记忆化,就能极大的减短搜索的时间。
所以感觉数位dp最重要的就是取找到能够公用的状态,用这个来记忆化搜索。
代码:
#include <bits/stdc++.h>using namespace std;const long long maxn=(1LL<<32)-1LL;long long dp[10][8*8];int p[20]={6,2,5,5,4,5,6,3,7,6,6,5,4,5,5,4};int num[20];int cal(long long x){ int i=0; while(x>0) { num[i++]=x%16; x/=16; } return i;}long long dfs(int pos, bool ismax, int sum){ if(pos<0) { return sum; } if(!ismax && dp[pos][sum]>=0)return dp[pos][sum]; int bound=ismax?num[pos]:15; int i; long long res=0; for(i=0; i<=bound; i++) { res+=dfs(pos-1, ismax && i==bound, sum+p[i]); } if(!ismax)dp[pos][sum]=res; return res;}int main(){ int t; long long m; cin>>t; char s[20]; memset(dp, -1, sizeof dp); cal(maxn); while(t--) { scanf("%lld%s", &m, s); long long x=0; int len; for(int i=0; s[i]; i++) { if(s[i]<='9')num[i]=s[i]-'0'; else num[i]=s[i]-'A'+10; x=x*16+num[i]; } memset(num, 0, sizeof num); len=cal(x-1); long long ans, mid, r, l=dfs(7, 1, 0);// memset(dp, 0, sizeof dp); if(x==0)l=0; if(x+m<=maxn) { memset(num, 0, sizeof num); cal(x+m-1LL); r=dfs(7, 1, 0); // memset(dp, 0, sizeof dp); ans=r-l; } else { memset(num, 0, sizeof num); cal(maxn); mid=dfs(7, 1, 0); if(maxn==x+m+1)ans=mid-l; else { memset(num, 0, sizeof num); cal(x+m-maxn-2); r=dfs(7, 1, 0); // memset(dp, 0, sizeof dp); ans=r+mid-l; } }// printf("%lld %lld %lld %lld \n", l, r, mid, maxn); printf("%lld\n", ans); }}
0 0
- ZOJ 3962Seven Segment Display (数位DP)
- zoj 3962 Seven Segment Display 数位dp
- zoj 3962 Seven Segment Display(数位dp)
- zoj 3962 Seven Segment Display 数位dp
- ZOJ 3962 Seven Segment Display(数位dp)
- ZOJ 3962 Seven Segment Display(*数位DP 总结)
- ZOJ 3962 Seven Segment Display (数位 DP)
- ZOJ 3962Seven Segment Display(数位dp)
- Seven Segment Display----数位dp
- Seven Segment Display(数位dp)
- 第十四届浙江省赛 ZOJ 3962 Seven Segment Display(数位DP)
- ZOJ 3962 Seven Segment Display
- 【ZOJ 3962 Seven Segment Display】
- 【zoj3962】Seven Segment Display(数位dp)
- ZOJ3962-Seven Segment Display(数位dp)
- ZOJ Seven Segment Display
- ZOJ 3954 Seven-Segment Display
- ZOJ 3954 Seven-Segment Display
- Windows 下编程开发备忘
- 请问 如果 我想实现出库和入库和下面四个在一行显示怎么改?
- 我是如何将linux用在开发环境中的
- spring工程的单元测试用例加载配置方法
- Unity3d网格合并
- zoj 3962 Seven Segment Display(数位dp)
- 手把手教你创建第一个fusioncharts
- 楼主资源下载
- Ubuntu 16.04 软件中心无法打开的解决办法
- 设计mysql索引的原则
- 三分钟让你彻底了解智能制造
- 2000年分区联赛普级组之三 乘积最大
- FD33里面的销售值不正确应该怎么办?
- 我在阅读 NodeJS 文档中读出的19个套路