您的位置:首页 > 其它

HDU-3555-Bomb-数位dp

2015-04-25 12:46 369 查看


Bomb

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)

Total Submission(s): 9396    Accepted Submission(s): 3314


[align=left]Problem Description[/align]
The counter-terrorists found a time bomb in the dust. But this time the terrorists improve on the time bomb. The number sequence of the time bomb counts from 1 to N. If the current number sequence includes the sub-sequence "49", the
power of the blast would add one point.

Now the counter-terrorist knows the number N. They want to know the final points of the power. Can you help them?

 

[align=left]Input[/align]
The first line of input consists of an integer T (1 <= T <= 10000), indicating the number of test cases. For each test case, there will be an integer N (1 <= N <= 2^63-1) as the description.

The input terminates by end of file marker.

 

[align=left]Output[/align]
For each test case, output an integer indicating the final points of the power.
 

[align=left]Sample Input[/align]

3
1
50
500

 

[align=left]Sample Output[/align]

0
1
15

HintFrom 1 to 500, the numbers that include the sub-sequence "49" are "49","149","249","349","449","490","491","492","493","494","495","496","497","498","499",
so the answer is 15.

 

[align=left]Author[/align]
fatboy_cw@WHU
 

[align=left]Source[/align]
2010 ACM-ICPC Multi-University Training Contest(12)——Host
by WHU
 

[align=left]Recommend[/align]
zhouzeyong   |   We have carefully selected several similar problems for you:  3554 3556 3557 3558 3559 

数位dp ,和hdu-2089是一样的方法。
hdu-2089题解
需要注意的是一定要用__int64 ,               long long 会wa。

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#include<fstream>
using namespace std;

ifstream fin("cin.in");
ofstream fout("test.out");

__int64 n;
int num,  pre;
__int64 ans;
__int64 dp[25][2];

void solve()
{
memset(dp, 0, sizeof(dp));
ans=1;
dp[0][0]=1;
pre=0;
__int64 t=n;
for(int i=1;;i++){
num=n%10;
n/=10;
if(num<=4&&num>0){

if(num==4&&pre==9){

ans=dp[i-2][0] * pre -  dp[i-2][1];

}

ans+=dp[i-1][0]*num;

}

if(num>4){

ans+=dp[i-1][0]*num - dp[i-1][1];

}

if(n==0) break;

dp[i][0]=dp[i-1][0]*10 - dp[i-1][1];
dp[i][1]=dp[i-1][0];

pre=num;
}
cout<<t+1-ans<<endl;
//printf("%I64d\n", t+1-ans);
return ;
}
int main()
{

int T;
cin>>T;
while(T--){
cin>>n;
solve();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: