HDU 4352 XHXJ's LIS

来源:http://www.cnblogs.com/hxer/archive/2016/01/31/5174003.html
-Advertisement-
Play Games

XHXJ's LIS 題意:求出給定區間[L,R] (0<L<=R<263-1 and 1<=K<=10) 中數滿足LIS(非連續嚴格遞增子序列)為K的個數? 如區間[123,321]中的124的LIS為3; <1> 總結數位DP的優化方式: 歸納高位之間的相同點,就是狀態的轉化是關鍵; 例: 1.


XHXJ's LIS

題意:求出給定區間[L,R]  (0<L<=R<263-1 and 1<=K<=10) 滿足LIS(非連續嚴格遞增子序列)為K的個數?

如區間[123,321]中的124的LIS為3;

<1> 總結數位DP的優化方式:

  • 歸納高位之間的相同點,就是狀態的轉化是關鍵;

例: 1.在codeforces 的beautiful number 中,要求滿足能被自己的每一個非零數字整除的數的個數。這時構造出lcm,當高位mod(所有元素的lcm直接優化到2520)後將會出現很多重疊的子問題,這就是狀態的轉移;當然裡面各種的lcm只需存儲即可;

     2.本題:首先要知道給定一個序列,知道怎麼求解LIS,如 1 2 4 6 ,當加入3時,這時長度為3的LIS的最小值為3,而不是4.(使用數組存儲的是[長度] = minval),但是本題並不是這樣的LIS,這需要模糊看待才能將不一樣的高位看成是相同的,才能有重疊的子結構.

在dfs開始時,state為0,這時如果前面加入的是98之後加入1,那麼按照原始的LIS長度是為1的,但是這裡長度看成3,為什麼?因為這裡state存儲的只是狀態,就是說dfs到pos-1位時,只知道前面有哪些值,並不需要知道加入的前後順序~~那這就將排序問題簡化為了組合問題,這才是優化的本質。這也是為什麼說state中的1個數就是LIS的值;(故意按照遞增排列的)

但是還有問題:

  • 能不能直接加入一個數,而不將前面的狀態刪減?不能,因為當你只是添加該位置的數時,就會發現在最後判斷是否state的1的個數為k時,只能是出現數字為k的值。如在樣例中你只能是 221,133,144這樣的值,而198這樣的值不行。所以必須要刪減。
  • 刪減的個數?題解中是只刪一個,如果要將當前插入的值放到最後,是需要將將後面更大的值全部刪掉的,但是這是一個組合問題,只需要優化該數所在的數值即可。即如果前面的數為1 2 4 5 現在插入的是3,3是LIS長度為3的點,之前該點的值是4,就把4改成3.開始我想的是把最大值刪去,在把當前的值插入是不是這樣的優化更好呢?但是發現裡面少了很多值.(你改後把樣例輸入發現結果為125,少計算瞭如191,190,291,290,292這些數);
  • 是否能前置0?1.當state還是0時,是不能將0加入狀態,但是當state中已經加入的元素,就可以;對情況1,這時就是數值的前置0,加了會和後面同值的數重覆,對於情況2,這時看做為前面LIS的優化相同長度的值,可以。

到此,就可以確定dfs的參數為4個pos,state,edge(原來就有),還要考慮一個是否有前置0的zero參數。

(使用的是內置函數__builtin_popcount()來計算數位1的個數)

#include<bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int (i)= 0;i < (n);i++)
#define MS1(a) memset(a,-1,sizeof(a))
typedef long long ll;
ll dp[20][1<<10][11];
int bit[20],K;
int newstate(int state,int v)
{
    for(int i = v;i < 10;i++)
        if(state &(1 << i)) return (state ^ (1 << i))|(1<<v);
    return state|(1<<v);
}
ll dfs(int pos,int state,bool edge,bool zero)
{
    if(pos == -1) return __builtin_popcount(state) == K;
    if(!edge && dp[pos][state][K] != -1) return dp[pos][state][K];
    int end = edge ? bit[pos]:9;
    ll ans = 0;
    for(int i = 0;i <= end;i++){
        ans += dfs(pos - 1,(zero && i == 0)?0:newstate(state,i),edge && i == end,zero && i == 0);
    }
    if(!edge) dp[pos][state][K] = ans;
    return ans;
}
ll calc(ll x)
{
    int tot = 0;
    while(x){
        bit[tot++] = x%10;
        x /= 10;
    }
    return dfs(tot - 1,0,1,1);
}
int main()
{
    int T,kase = 1;
    MS1(dp);
    cin>>T;
    while(T--){
        ll L,R;
        scanf("%I64d%I64d%d",&L,&R,&K);
        printf("Case #%d: %I64d\n",kase++,calc(R) - calc(L-1));
    }
}
View Code

 


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

-Advertisement-
Play Games
更多相關文章
  • 近段時間,開發的需要,需要寫一個winform的程式。用VB.NET來寫。 開發開始,需要實現一個窗體設為多文檔界面 (MDI) 子窗體的容器。實現這個功能,開始找資料,得知設置一個屬性:Form.IsMdiContainer,它預設值為False,沒為True即可。 或者是form Load時添加
  • 前言 作為一隻菜鳥,之前學了一段時間的WPF,但是沒有總結,過了一學期發現好多東西都忘記了,很多東西還是需要記下來,以備後續複習。 數據綁定在事件中應用非常廣泛,可以有效地減少代碼量,那麼什麼是數據綁定?說的簡單就是從源對象提取一些信息,將其用於設置目標對象的屬性,這裡有一點需要註意,目標屬性需要是
  • c語言inline函數的使用 轉載自:http://blog.chinaunix.net/uid-21843265-id-3056446.html 大學在教科書上學習過inline函數,定義為inline函數之後,會省去函數調用的開銷,直接嵌套彙編代碼,取代函數調用,提高效率。工作後項目中也 很少用
  • 在《喜劇之王》中,周星馳扮演的尹天仇,一直夢想成為一名演員,而他不管是在扮演跑龍套,或者在街坊中開設演員訓練班,亦或成為主角時,他對待演員的態度,始終是認真,熱愛而又投入的。而那一本他隨身攜帶的書--《演員的自我修養》,儘管不知道裡面具體寫的是什麼,但我猜,他對待演員的態度和行為,就是書中內容顯示的
  • implode把數組轉成字元串的函數,在組合SQL語句時候使用特好使! 比如 $a = array('a','b','c');$b = implode(',', $a);echo $b; 返回的字元串就是 a,b,c explode把字元串組成的數組 $pizza = "piece1 piece2 
  • strlen() 和 strcpy()函數的區別,這兩個一個是返回一個C風格字元串的長度,一個是對一個C風格字元串的拷貝,兩個本來功能上是不同的,此外,他們還有一些細小的區別:strlen("hello")返回的結果是5,是不包含字元串結尾處的‘\0’,但是strcpy(str1,str2),會拷貝
  • /* * String的轉換功能: * byte[] getBytes():把字元串轉換為位元組數組。 * char[] toCharArray():把字元串轉換為字元數組。 * static String valueOf(char[] chs):把字元數組轉成字元串。 * static String
  • 一、冒泡演算法實例: a = [32,5,22,41,7,31,12,102,74,37,9,25] 1、方法1: for i in range(len(a)): for j in range(len(a)-1): if a[j] > a [j+1]: tmp = a[j] a[j] = a[j+1]
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...