本文主要是介绍HDU 3555 Bomb,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555
Bomb
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)
Total Submission(s): 15270 Accepted Submission(s): 5515
Problem Description
Now the counter-terrorist knows the number N. They want to know the final points of the power. Can you help them?
Input
The input terminates by end of file marker.
Output
Sample Input
3 1 50 500
Sample Output
0 1 15HintFrom 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.
Author
Source
Recommend
思路:经典的数位DP。自己不太懂这个知识点,参考了一位大神的博客,很详细,如下所示。
http://www.cnblogs.com/liuxueyang/archive/2013/04/14/3020032.html
附上AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 25;
ll dp[maxn][3];
int num[maxn];
ll n;void init(){dp[0][0] = 1;for (int i=1; i<maxn; ++i){dp[i][0] = dp[i-1][0]*10-dp[i-1][1];dp[i][1] = dp[i-1][0];dp[i][2] = dp[i-1][2]*10+dp[i-1][1];}
}int main(){init();int T;scanf("%d", &T);while (T--){scanf("%I64d", &n);ll ans = 0;bool ok = false;int len = 0;while (n){num[++len] = n%10;n /= 10;}for (int i=len; i>=1; --i){ans += dp[i-1][2]*num[i];if (ok)ans += dp[i-1][0]*num[i];if (!ok && num[i]>4)ans += dp[i-1][1];if (i+1<=len && num[i+1]==4 && num[i]==9)ok = true;}if (ok)++ans;printf("%I64d\n", ans);}return 0;
}
这篇关于HDU 3555 Bomb的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!