hdu 3555 数位dp水题 记忆化搜索做法

#include<iostream>

#include<cstring>

#include<cstdio>

using namespace std ;

const int maxn = 20;

__int64 dp[maxn][3] ;//dp[i][flag] ,flag = 2,表示已经有49,flag == 1,表示没有49,这一位是4,

int bit[maxn] ;    //flag == 0, 什么都没有

__int64 dfs(int pos , int flag , int lim)

{

if(pos == 0)

return (flag == 2);

if(!lim && dp[pos][flag] != -1)return dp[pos][flag] ;

int num = lim ? bit[pos] : 9 ;

__int64 ans  = 0;

for(int i = 0; i <= num ;i++)

{

int flag_x = flag ;

if(flag == 1 && i == 9)

flag_x = 2;

else if(flag == 0 && i == 4)

flag_x = 1;

else if(flag == 1 && i!=4)

flag_x = 0;

ans+=dfs(pos - 1 , flag_x ,lim && (i==num)) ;

}

if(!lim)dp[pos][flag] = ans;

return ans ;

}

int main()

{

int T ;

scanf("%d" ,&T) ;

while(T--)

{

__int64 n ;

scanf("%I64d" ,&n) ;

__int64 t = n ; int len = 0;

while(t)

{

bit[++len] = t%10 ;

t/=10 ;

}

memset(dp , -1 ,sizeof(dp)) ;

printf("%I64d\n" ,dfs(len , 0 , 1)) ;

}

return 0 ;

}

时间: 2024-10-03 14:05:19

hdu 3555 数位dp水题 记忆化搜索做法的相关文章

HDU 4960 Another OCD Patient(记忆化搜索)

HDU 4960 Another OCD Patient 题目链接 记忆化搜索,由于每个碎片值都是正数,所以每个前缀和后缀都是递增的,就可以利用twopointer去找到每个相等的位置,然后下一个区间相当于一个子问题,用记忆化搜索即可,复杂度接近O(n^2) 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int INF = 0x3f3f3f

hdu4753 状态压缩dp博弈(记忆化搜索写法)

http://acm.hdu.edu.cn/showproblem.php?pid=4753 Problem Description There is a 3 by 3 grid and each vertex is assigned a number. It looks like JiuGongGe, but they are different, for we are not going to fill the cell but the edge. For instance, adding

HDU 1208 Pascal&#39;s Travels( 记忆化搜索)

题目大意:每一小格代表能向右或者向下走几步,问从左上走到右下总共有多少种走法. dp[i][j]存放该格子有多少总走法. #include <iostream> #include <cstring> using namespace std; int n; char a[40][40]; int s[40][40]; __int64 dp[40][40]; int X[]={1, 0}; int Y[]={0, 1}; __int64 dfs(int x, int y) { if(d

NYOJ16|嵌套矩形|DP|DAG模型|记忆化搜索

矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度).例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中.你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内. 输入 第一行是一个正正数N(0<N<10),表示测试数据组数,每组测

换根dp+暴力+预处理+记忆化搜索——cf1292C好题!

/** 给定一棵树,要求给树边赋值[0,n-2],每个值只能使用一次 S = mex(u,v), mex(u,v)是u-v路径上没有出现过的编号最小的值 问使得S最大的赋值方式 由于很难直接统计答案,所以考虑统计每条边的贡献 包含(0)路径的贡献tot1是其左右子树size的乘积 包含(0,1)的路径的贡献tot2是其左右子树的size乘积 ...依次类推 显然:只包含(1,2)这样的路径是没有贡献的 那么原问题转化为如何分配[0,n-2],使得最后的乘积和最大 dp[u][v]表示路径(u,v

HDU 1331 Function Run Fun (基础记忆化搜索)

Function Run Fun Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2602    Accepted Submission(s): 1263 Problem Description We all love recursion! Don't we? Consider a three-parameter recursive f

HDU 1428 漫步校园 (BFS+优先队列+记忆化搜索)

题目地址:HDU 1428 先用BFS+优先队列求出所有点到机房的最短距离,然后用记忆化搜索去搜. 代码如下: #include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #include <stdlib.h> #include <map> #include <set> #incl

集训第五周动态规划 I题 记忆化搜索

Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道载一个区域中最长底滑坡.区域由一个二维数组给出.数组的每个数字代表点的高度.下面是一个例子 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小.在上面的例子

ACM学习历程—ZOJ3471 Most Powerful(dp &amp;&amp; 状态压缩 &amp;&amp; 记忆化搜索 &amp;&amp; 位运算)

Description Recently, researchers on Mars have discovered N powerful atoms. All of them are different. These atoms have some properties. When two of these atoms collide, one of them disappears and a lot of power is produced. Researchers know the way