拓撲排序&關鍵路徑&數位dp

      今上午看了拓撲排序和關鍵路徑,瞭解了基本原理,至於代碼還只看了模版,題目還沒有多看。

      今下午和晚上,複習了數位DP,有了更加深入的認識,基礎題型是計算一個區間(a,b)符合某個條件的數的個數。一般數位dp是一種暴力枚舉的方法。它就是在數位上一位一位的枚舉,使得這種枚舉方式符合dp的定義,並且使用記憶化搜索,就會節省枚舉的時間。換了一個模版,實用性更大,但是不怎麼好理解,暫時可以理解個大概:

   

  1. int a[20];  
  2. int dp[20][state];  
  3.   
  4. int dfs(int pos,int zhuangtai,/*這裏可能有很多狀態*/int limit)  
  5. {  
  6.     if(pos==-1)return 1;//這裏根據情況不一樣,返回值不一樣  
  7.     if(!limit&&dp[pos][state]!=-1/*如果有前導零的題,這裏還有前導零的判斷*/)return dp[pos][state];  
  8.     int sum=0;  
  9.     int end=limit?a[pos]:9;//這裏是根據這一位數是否應該有限制,設置枚舉的最大數,不過這是十進制的  
  10.     for(int i=0;i<=end;i++)//循環  
  11.     {  
  12.         if()....//限制條件。  
  13.         sum+=dfs(pos-1,/*狀態或者前導零*/limit&&i==a[pos])  
  14.           
  15.     }  
  16.     if(!limit/*有時候有前導零*/)dp[pos][state];  
  17.     return sum;  
  18.   
  19.   
  20. }  
  21.   
  22. int solve(int x)  
  23. {  
  24.     int pos=0;  
  25.     while(x)  
  26.     {  
  27.         a[pos++]=x%10;  
  28.         x/10;  
  29.     }//這裏是數位分解 
  30.     return dfs(pos-1,/*狀態限制*/,1);  
  31. }  
  32. int main()  
  33. {  
  34.     int q,w;  
  35.     while(~scanf("%d%d",&q,&w))  
  36.     {  
  37.         printf("%d\n",solve(q)-solve(w));  
  38.     }  
  39.     return 0;  


發佈了101 篇原創文章 · 獲贊 23 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章