problem description
杭州人稱那些傻乎乎粘嗒嗒的人為62(音:laoer)。
杭州交通管理局經常會擴充一些的士車牌照,新近出來乙個好訊息,以後上牌照,不再含有不吉利的數字了,這樣一來,就可以消除個別的士司機和乘客的心理障礙,更安全地服務大眾。
不吉利的數字為所有含有4或62的號碼。例如:
62315 73418 88914
都屬於不吉利號碼。但是,61152雖然含有6和2,但不是62連號,所以不屬於不吉利數字之列。
你的任務是,對於每次給出的乙個牌照區間號,推斷出交管局今次又要實際上給多少輛新的士車上牌照了。
input
輸入的都是整數對n、m(0output
對於每個整數對,輸出乙個不含有不吉利數字的統計個數,該數值佔一行位置。
sample input
1 100
0 0sample output
這個題用到數字dp(動態規劃)的思想,詳解請參考博文
「數字dp」歸根結底就以深度優先搜尋的方式,列舉某區間內的數字,並求解出符合約束條件的數字的個數。
以統計765範圍內不包含「4」和「62的數字的個數為例。
我們先把整形數字765變為字串,寫到字元型陣列中。以深度搜尋的方式來統計0-765範圍內符合要求的數字的個數。
設定兩個指標,前位指標pre和當前位指標pos,再深搜過程中,pre指向當前位的上一位,pos則指向當前位。
從最高位開始深搜,如果發現前位指標pre對應的值是「6」,當前位指標pos對應的值是「2」,或者pos對應的值是「4」,說明這個數是不合法的,需要更換當前位的值,或者是回溯到上一位並更換上一位的值,然後繼續從相應的位置深搜。如果從最高位一直深搜到最低位而沒有出現「62」或「4」,說明我們已經找到了一串符合要求的數字,納入統計。
假設題目給定的範圍是m-n,分別計算出m中不包含「4」和「62」的數字個數和n中不包含「4」和「62」的個數,再把這兩個數相減,就得到我們想要的結果。
另外附上數字dp的模板:#include#include#includeusing namespace std;
typedef long long ll;
int a[20];
int dp[20][2];
int dfs(int pos,int pre,int sta,bool limit)
if(!limit) dp[pos][sta]=tmp;
return tmp;
}int solve(int x)
return dfs(pos-1,-1,0,true);
}int main()
return 0;
}
注:解題思路,實現**,演算法模版均參考自博文侵刪),在這裡向博文作者大佬致敬。typedef long long ll;
int a[20];
ll dp[20][state];//不同題目狀態不同
ll dfs(int pos,/*state變數*/,bool lead/*前導零*/,bool limit/*數字上界變數*/)//不是每個題都要判斷前導零
//計算完,記錄狀態
if(!limit && !lead) dp[pos][state]=ans;
/*這裡對應上面的記憶化,在一定條件下時記錄,保證一致性,當然如果約束條件不需要考慮lead,這裡就是lead就完全不用考慮了*/
return ans;
}ll solve(ll x)
return dfs(pos-1/*從最高位開始列舉*/,/*一系列狀態 */,true,true);//剛開始最高位都是有限制並且有前導零的,顯然比最高位還要高的一位視為0嘛
}int main()
}
杭電2089 不要62
problem description 杭州人稱那些傻乎乎粘嗒嗒的人為62 音 laoer 杭州交通管理局經常會擴充一些的士車牌照,新近出來乙個好訊息,以後上牌照,不再含有不吉利的數字了,這樣一來,就可以消除個別的士司機和乘客的心理障礙,更安全地服務大眾。不吉利的數字為所有含有4或62的號碼。例如 ...
杭電ACM 2089 不要62
這個題目的意思就是從給定的乙個數字範圍內,求出不包含不吉利數字4或者62的數字個數。所以主要問題是如何判斷該數是不是吉利數字,我的想法是對於乙個數字,一位一位的進行判斷該位是否為4或者連續兩位是否為62。這個很容易實現,一開始我寫的 如下 include using namespace std in...
數字DP HDU2089 不要62
problem description 杭州人稱那些傻乎乎粘嗒嗒的人為62 音 laoer 杭州交通管理局經常會擴充一些的士車牌照,新近出來乙個好訊息,以後上牌照,不再含有不吉利的數字了,這樣一來,就可以消除個別的士司機和乘客的心理障礙,更安全地服務大眾。不吉利的數字為所有含有4或62的號碼。例如 ...