题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5632

------------------------------------------------------------------------------------------

这场比赛的官方题解说这题比较明显, 然而我比赛完后对着题解看了好久也没有想明白

于是先做了几道数位$DP$找找感觉 可惜感觉并没有找到

这题和传统数位$DP$不一样 这题是求范围内满足要求的数对的个数

既然是数对 我们记录时便不再记录数的状态 而是记录两数之间的关系的状态

不过官方题解只记录 考虑到了哪位 两数$1$的个数差的绝对值

大数$1$的个数是否不小于小数$1$的个数 这三个部分

可惜自己做的时候总感觉只记录这些状态还不够

然后$Cwind$前辈提供了一个思路 额外记录两个部分

大小两数当前位之前是否相等 大数当前位之前是否与限制条件相等

------------------------------------------------------------------------------------------

用以上的思路就可以比较轻松的用记忆化搜索做了

不过由于状态多两维 而且一开始的写法每次询问都需要重新计算 因而时间比较挫 要$1.4s$

观察后可发现如果较大数的当前位之前于限制条件不等 那么后面的数的选取都是任意的

所以这种情况下并不用每次重新计算 加了这个常数优化后要 $0.6s$

再加上一个对于当前状态贡献一定是$0$的剪枝后还要$0.48s$

 #include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int N = , mod = ;
int f[N][N][][][], cnt[N][N][][][];//cnt记录的是时间戳
bool bin[N];
int num[];
char s[];
int t, len, n;
void init()
{
n = ;
while(len)
{
for(int i = len; i; --i)
{
num[i - ] += (num[i] & ) * ;
num[i] >>= ;
}
bin[++n] = (num[] != );
num[] = ;
if(!num[len])
--len;
}
}
int dfs(int x, int dif, bool over, bool same, bool top)
{
if(cnt[x][dif][over][same][top] == t + ||
(cnt[x][dif][over][same][top] && !top))
return f[x][dif][over][same][top];
cnt[x][dif][over][same][top] = t + ;
if(!x)
return f[x][dif][over][same][top] = !over;
if(over && dif >= x)
return f[x][dif][over][same][top] = ;
int re = ;
if(!top || bin[x])
{
re += dfs(x - , dif, over, same, top);
re += dfs(x - , dif + (over ? : -), over || dif == , , top);
re = (re >= mod ? re - mod : re);
}
if(!same)
{
re += dfs(x - , abs(dif + (over ? - : )), over && dif, , top && !bin[x]);
re = (re >= mod ? re - mod : re);
}
re += dfs(x - , dif, over, same, top && !bin[x]);
re = (re >= mod ? re - mod : re);
return f[x][dif][over][same][top] = re;
}
int main()
{
scanf("%d", &t);
while(t--)
{
scanf("%s", s + );
len = strlen(s + );
for(int i = ; i <= len; ++i)
num[i] = s[len - i + ] - '';
init();
printf("%d\n", dfs(n, , , , ));
}
return ;
}

想到/理解了 更好的方法再来改改吧

HDU 5632 Rikka with Array [想法题]的更多相关文章

  1. HDU - 5806 NanoApe Loves Sequence Ⅱ 想法题

    http://acm.hdu.edu.cn/showproblem.php?pid=5806 题意:给你一个n元素序列,求第k大的数大于等于m的子序列的个数. 题解:题目要求很奇怪,很多头绪但写不出, ...

  2. HDU 4972 Bisharp and Charizard 想法题

    Bisharp and Charizard Time Limit: 1 Sec  Memory Limit: 256 MB Description Dragon is watching NBA. He ...

  3. HDU - 5969 最大的位或 想法题

    http://acm.hdu.edu.cn/showproblem.php?pid=5969 (合肥)区域赛签到题...orz 题意:给你l,r,求x|y的max,x,y满足l<=x<=y ...

  4. hdu 5532 Almost Sorted Array (水题)

    Almost Sorted Array Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Ot ...

  5. 【HDOJ】5632 Rikka with Array

    1. 题目描述$A[i]$表示二级制表示的$i$的数字之和.求$1 \le i < j \le n$并且$A[i]>A[j]$的$(i,j)$的总对数. 2. 基本思路$n \le 10^ ...

  6. hdu 6095 Rikka with Competition---思维题贪心

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6095 题目大意: 任意两个人相比,相差大于K,分低的淘汰,否则两人都有可能赢,剩下的继续比,问有最多 ...

  7. HDU 4638 树状数组 想法题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4638 解题思路: 题意为询问一段区间里的数能组成多少段连续的数.先考虑从左往右一个数一个数添加,考虑当 ...

  8. HDU 5908 Abelian Period(暴力+想法题)

    传送门 Description Let S be a number string, and occ(S,x) means the times that number x occurs in S. i. ...

  9. hdu 5063 不错的小想法题(逆向处理操作)

    题意:       刚开始的时候给你一个序列,长度为n,分别为a[1]=1,a[2]=2,a[3]=3,a[4]=4...a[n]=n,然后有4种操作如下: Type1: O 1 call fun1( ...

随机推荐

  1. centos7安装配置jdk、tomcat

    centos7安装jdk1.8 1.新建文件夹java,上传文件jdk-8u111-linux-x64.tar.gz到java文件夹 2.解压tar包: tar -zxvf jdk-8u111-lin ...

  2. vue组件通信之父子组件通信

    准备工作: 首先,新建一个项目,如果这里有不会的同学,可以参考我转载过的文章 http://www.cnblogs.com/Sky-Ice/p/8875958.html  vue 脚手架安装及新建项目 ...

  3. 关于Python学习的一点说明

    关于Python学习的一点说明 我是用什么地方的资料来学习python的呢? 答案当然是鼎鼎大名的GitHub了. 5万多星推荐,100天让你从入门到精通,你值得拥有,点我进入查看

  4. SpringMVC处理器拦截器 Interceptor

    拦截器概念 Java 里的拦截器是动态拦截action调用的对象.它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种 ...

  5. Neo4j的查询语法笔记(二)

    cypher是neo4j官网提供的声明式查询语言,非常强大,用它可以完成任意的图谱里面的查询过滤,我们知识图谱的一期项目 基本开发完毕,后面会陆续总结学习一下neo4j相关的知识.今天接着上篇文章来看 ...

  6. 【Matlab技巧】工作区变量如何添加到Simulink中?

    对新手来说,在进行simulink仿真时想把工作区的变量添加到Simulink中,这样在如transfer模块中使用时可以直接输变量即可. 如这样: 那么如何对Simulink仿真文件自动赋值呢? 1 ...

  7. 帝国CMS自定义页面的添加与目录式链接的处理

    需求: 1.将某一本地前端自定义页面模板,导入到帝国系统,应用到网站 2.将导入的页面在站点中打开为目录式链接 www.abc.com/softlink/ 环境: 1.windows服务器 2.帝国C ...

  8. css炫酷动画收藏

    1.按钮.hover.input动画(cssfx) https://cssfx.dev/ 2.svg 矢量定制icon(ikonate) https://www.ikonate.com/#conten ...

  9. 线程屏障CyclicBarrier实现原理

    生产环境中,存在需要等待多个线程都达到某种状态后,才继续运行的情景.并发工具CyclicBarrier就能够完成这种功能.本篇从源码方面,简要分析CyclicBarrier的实现原理. 使用示例 pu ...

  10. 【记录】Git pull(拉取),push(上传)命令整理(详细)

    前言:博主最近在学习git命令,因为git是一个非常好用的分布式版本管理工具,功能比svn强大,与SVN不同点是Git去中心化,每一个分支都是一个中心,并且支持本地仓库存储,像如今很多大公司都用git ...