您的位置:首页 > 其它

HDU - 3555 Bomb 数位DP

2014-11-27 00:16 429 查看
题目大意:如果一个数中出现连续的49的话就表示***的能量+1,给你一个数,求从0到这个数的这个区间内,***的能量可以到达多少

解题思路:数位DP的模板题,判断的时候加个flag标志表示是否满足能量加1这个要求

#include<cstdio>
#include<cstring>
#define ll __int64
int data[30];
ll dp[30][12][3];
ll DP(int pos,int pre,int flag,int board) {
		
	if(pos == -1)
		return flag == 1;
	if(!board && dp[pos][pre][flag] != -1)
		return dp[pos][pre][flag];

	ll ans = 0;
	int end = board ? data[pos]:9;

	for(int i = 0; i <= end; i++) {
		if(pre == 4 && i == 9)
			ans += DP(pos-1,i,1,board && (i == end));
		else
			ans += DP(pos-1,i,flag,board && (i == end));
	}
	if(!board)
		dp[pos][pre][flag] = ans;
	return ans;
}

ll solve(ll x) {

	int pos = 0;
	while(x) {
		data[pos++] = x % 10;
		x = x /10;	
	}
	ll ans =DP(pos-1,-1,0,1);
	return ans;
}

int main() {
	int test;
	ll right;
	scanf("%d",&test);
	while(test--) {
		scanf("%I64d",&right);	
		memset(dp,-1,sizeof(dp));
		printf("%I64d\n",solve(right));
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: