程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU-4734-F(x)

HDU-4734-F(x)

編輯:C++入門知識

Problem Description For a decimal number x with n digits (AnAn-1An-2 ... A2A1), we define its weight as F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1. Now you are given two numbers A and B, please calculate how many numbers are there between 0 and B, inclusive, whose weight is no more than F(A).
Input The first line has a number T (T <= 10000) , indicating the number of test cases.
For each test case, there are two numbers A and B (0 <= A,B < 109)
Output For every case,you should output "Case #t: " at first, without quotes. The t is the case number starting from 1. Then output the answer.
Sample Input

3
0 100
1 10
5 100

Sample Output
Case #1: 1
Case #2: 2
Case #3: 13

Source 2013 ACM/ICPC Asia Regional Chengdu Online
一道很簡單的數位DP!!!!DP[pos][sum] 記錄的是長度為pos小於等於sum的個數,這樣就不用每次都初始化,我一開始DP記錄的是長度為pos,前len-pos個數和sum的個數,因為每組樣例DP的值不一定相同 如 1 10 dp[0][0] = 1; 而 2 100 dp[0][0] = 2;因此每次都需要初始化,這也是導致超時的原因。 這是一道很好的DP題!
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
int dp[12][4600];
int A,B;
int F;
vector  digit;
void init(){
    F = 0;
    int t = 0;
    while(A){
        F += (A%10)*(1< F) break;
        res += dfs(pos-1,val + i*(1<> ncase;
    memset(dp,-1,sizeof dp);
    while(ncase--){
        cin >> A >> B;
        init();
        printf("Case #%d: %d\n",T++,solve(B));
    }
    return 0;
}




  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved