HDU 2089-no 62 (entrada digital DP)

No 62

Límite de tiempo: 1000/1000 MS (Java / otros) Límite de memoria: 32768/32768 K (Java / otros)
Envíos totales: 44379 Envíos aceptados: 16453


Descripción del problema
La gente de Hangzhou llama a los que son estúpidos y pegajosos como 62 (laoer).
La Administración de Transporte de Hangzhou a menudo amplía algunas matrículas de taxis. Recientemente, hay buenas noticias de que las matrículas ya no contendrán números desafortunados. De esta manera, se pueden eliminar las barreras psicológicas de los taxistas y pasajeros individuales. Servir al público de manera segura.
Los números desafortunados son todos los números que contienen 4 o 62. Por ejemplo:
62315 73418 88914
son todos números desafortunados. Sin embargo, aunque 61152 contiene 6 y 2, no son 62 números consecutivos, por lo que no se encuentra entre los números desfavorables.
Su tarea es inferir cuántos taxis nuevos tendrá realmente matrículas la Oficina de Gestión del Tráfico por cada vez que se dé un número de intervalo de matrículas.
 

Aporte
La entrada es un par entero nym (0 <n≤m <1000000). Si se encuentra un par entero que es todo 0, la entrada finaliza.
 

Producción
Para cada par de enteros, genere un número estadístico que no contenga un número desafortunado, y este número ocupa una fila.
 

Entrada de muestra
  
   
   
1100 0 0
 

Salida de muestra
  
   
   
80
                                                                                                                                                                                                                                       
//数位DP
//这道题可以处理long long范围的
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

int dp[25][2];                       //dp[i][0]表示的是第i-1位不是6时且没有限制时,第i位以及后面位数能组成合法数的个数(dp[i][1]表示的是第i-1位是6时)
int a[25];                           //拆成一个一个的数

//4个参数分别是当前位,前一位的数值,前一位的数值是否为6,有无受前面数字的限制
int dfs(int pos, int pre, int stu, bool limit)
{
	//到个位的时候,对应的数肯定是只有1个了
	if(pos==-1)
		return 1;
	//已经计算过的了,优化
	if(!limit && dp[pos][stu]!=-1)
		return dp[pos][stu];
	//判断有无限制, 如果有限制,那当前位只能取0-a[pos], 如果没有限制, 就可以取0-9,up存的就是上限
	int up = limit?a[pos]:9;
	//记录最终结果
	int temp = 0;
	//取值,0-up
	for(int i=0; i<=up; i++)
	{
		//把不合法的排除
		if(i==4 || (pre==6 && i==2))
			continue;
		temp += dfs(pos-1, i, i==6, limit && i==a[pos]);
	}
	if(!limit)
		dp[pos][stu] = temp;
	return temp;
}

int slove(int r)
{
	int pos = 0;
	while(r)
	{
		a[pos++] = r%10;
		r/=10;
	}
	//初始是,最高位, 前一位的数当做-1不受影响,前一位不等于6,第一位有受限制
	return dfs(pos-1, -1, 0, true);
}

int main()
{
	int l, r;
	while(scanf("%d%d", &l, &r), l+r)
	{
	    memset(dp, -1, sizeof(dp));
		printf("%d\n", slove(r)-slove(l-1));
	}
}



Supongo que te gusta

Origin blog.csdn.net/qq_31281327/article/details/76675100
Recomendado
Clasificación