hdu 2089 不要62(數位DP)

来源:https://www.cnblogs.com/noback-go/archive/2019/03/20/10567886.html
-Advertisement-
Play Games

不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 64679 Accepted Submission(s): 25710 Problem ...


不要62

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 64679    Accepted Submission(s): 25710


Problem Description 杭州人稱那些傻乎乎粘嗒嗒的人為62(音:laoer)。
杭州交通管理局經常會擴充一些計程車車牌照,新近出來一個好消息,以後上牌照,不再含有不吉利的數字了,這樣一來,就可以消除個別計程車司機和乘客的心理障礙,更安全地服務大眾。
不吉利的數字為所有含有4或62的號碼。例如:
62315 73418 88914
都屬於不吉利號碼。但是,61152雖然含有6和2,但不是62連號,所以不屬於不吉利數字之列。
你的任務是,對於每次給出的一個牌照區間號,推斷出交管局今次又要實際上給多少輛新計程車車上牌照了。   Input 輸入的都是整數對n、m(0<n≤m<1000000),如果遇到都是0的整數對,則輸入結束。   Output 對於每個整數對,輸出一個不含有不吉利數字的統計個數,該數值占一行位置。   Sample Input 1 100 0 0   Sample Output 80   鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2089   題目大意:在n-m中有多少個不含 62 4的數   解題思路:   數位DP。記憶化搜索。可以想到用首碼和來解決問題,具體來說,就是[a,b] = [0,b] - [0,a)。   數位DP,將數字各位(個,十,百,千……)分為單一的數字(例如:654321,將其分成 6 5 4 3 2 1)。分數據,我們需要記錄什麼呢?數字的長度是必須記錄的(在此例中長度len=6),因為我們隨後的搜索需要以長度來作為條件。   運用搜索,可以從兩個方向搜索。一是從最高位,二是從最低位。兩者中我們選擇前者。解釋一下:   因為數據較大,我們要儘可能優化時間,所以要用到記憶化搜索。我們選擇從最高位開始搜索,如果我們遍歷0-9後得到一個答案9,我們存起來,然後當遍歷10-19時 可以直接使用這個答案9,因為他們的過程是相同的。數字擴大之後也是同樣的道理。如果選擇從低位搜索,就做不到這樣的效果。dp意義也就失去了,純暴力。。   先上AC代碼,下麵繼續解釋  
#include<stdio.h>
#include<string.h>

int a,b,dp[20][2],shu[20];

int dfs(int len,bool if6,bool up)
{
    if(len==0) return 1;
    if(!up&&dp[len][if6])
        return dp[len][if6];    //記憶 
    int cnt=0,maxx=up?shu[len]:9;   //迴圈限制 
    for(int i=0;i<=maxx;i++)
    {
        if(i==4||if6&&i==2)   //搜索到4時直接跳出不計數,當上一位為6並且這一位為2時跳出不計數 
            continue ;
        cnt+=dfs(len-1,i==6,up&&i==maxx);
    }
    return up?cnt:dp[len][if6]=cnt;
}

int solve(int x)
{
    int k=0;
    memset(shu,0,sizeof(shu));
    while(x)
    {
        shu[++k]=x%10;
        x/=10;
    }
    return dfs(k,false,true);
}

int main()
{
    while(scanf("%d%d",&a,&b)!=EOF&&(a+b))
    {
        printf("%d\n",solve(b)-solve(a-1));
    }
    return 0;
}
View Code

 

現在解釋一下搜索。len是當前搜索位,if6為上一位是否為6,up為上一位是否是最大值(還是654321,當len=6,up為ture,所以迴圈只能到達i==6;如果len=6,i<6,dfs,那麼up為false,所以迴圈可以到9).

直觀數字  給定數字235,搜索len=3時,如果迴圈中i=1,那麼下一位可以搜索到9,即從100-190;如果迴圈中i=2,那麼下一位搜索只能迴圈到3,即從200-230。

解釋起來有些困難,理解代碼更容易一點。

因水平有限,只能解釋到這裡了。。。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • /************************************************** *程式名:test1.cpp *編輯者:鴻灬噯 *註:驗證全局變數的改變。 ***************************************************/ #includ... ...
  • 普通的bean的初始化是在容器啟動初始化階段執行的,而被lazy-init修飾的bean 則是在從容器里第一次進行context.getBean(“”)時進行觸發。Spring 啟動的時候會把所有bean信息(包括XML和註解)解析轉化成Spring能夠識別的BeanDefinition並存到Has ...
  • 1.spring約束的導入 2.SSH常用約束 3.application.xml的引入方式 <1.通過ClassPathXmlApplicationContext引入配置文件application.xml <2.application.xml <3.命名空間的引入 4.在過濾器中配置applica ...
  • 今天遇到一問題,js文件中調用字元串的replace方法,不起作用。 後來排查可能覺得replace("<option value='1'>admin</option>","")中,前邊的字元串單引號也要和頁面上的一致才能。 果然發現頁面中的value用的是“”雙引號,我自己寫的是''單引號,導致匹 ...
  • C語言中的記憶體分配與釋放 對C語言一直都是抱著學習的態度,很多都不懂,今天突然被問道C語言的記憶體分配問題,說了一些自己知道的,但感覺回答的並不完善,所以才有這篇筆記,總結一下C語言中記憶體分配的主要內容。 相關問題 剛剛在一篇博文看到一個簡單的問題: 兩段代碼都很簡單,輸出一段字元,類型不同,一個是c ...
  • 使用python requests模塊調用vmallarg.vmall.com介面API時報如下錯誤: requests.exceptions.ConnectionError: HTTPSConnectionPool(host='vmallrag.vmall.com', port=443): Max ...
  • 由題意可得出遞推式$f[i ,j]=\sum_{e\in S} f[i 1,\frac{j}{e}]$,初值$f[0,0]=1$,答案為$f[n,x]$,具體意義不表。 分析可知$f[1,e(e\in S)]=1$,$f[i,ab]=\sum_{a\in S,b\in S}f[i 1,a]f[1,b ...
  • ! 本文編輯中 `centos ssh 無法連接 ` ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...