HDU 4352(數字dp 狀態壓縮 LIS)

2021-10-02 02:43:56 字數 908 閱讀 3436

求區間範圍內最長上公升子串行數字k的數字有多少個

首先由數字dp引入思路,dp轉移方程為:

dfs(pos,…status.) = 累加dfs(pos-1,.stautselse…)

可備忘錄記錄的dp陣列為 dp[pos][status][k] ,之所以要備忘錄k,是為了滿足不同k的訪問

status記錄的是開頭數字到pos位置所選擇的數字組合,通過二進位制壓縮狀態為乙個數字,二進位制位數 i 對應1代表存在,0代表不存在。

得到stautus的方式是一種等效的lis的方式,注意是等效,訪問具體位數上的1存在可能並不是正確的,但對最長上公升子串行的長度是沒變的。

由此數字dp中最後判斷乙個數是結果方式就變成了-1位情況下取出了乙個確定數,該數的最長上公升子串行的長度是否等於k。其它按照數字dp正常方式來做,注意前導0,因為該題使用的lic演算法是沒有考慮x=0的情況,會造成二進位制0位上也出現1,導致最長上公升子串行結果+1。

#include #include #define ll long long

using namespace std;

int k;

int dig[25];

ll dp[25][1<<10][11];

int changes(int s, int x)

return ans;

}ll dfs(int pos,int sta, int limit, int pre)

if(!limit) dp[pos][sta][k] = ans;

return ans;

}ll slove(ll x)

ll ans = dfs(pos-1,0,1,1);

return ans;

}int main()

return 0;

}

hdu4352 數字dp 狀態壓縮

題意 給出l和r找出在 l,r 中滿足最長遞增子串行長度等於k的個數。題解 狀壓想不到,看了kuangbin的才明白,1 10狀壓存數出現了沒有。利用了nlogn遞增字序列演算法的思想。include include include include includeusing namespace st...

HDU 4352做題筆記

聽說是多校的題,難怪做自閉了 參考了網上各種題解終於大概懂了,這裡放幾個我參考的 i.ii.iii.首先本題要求l到r範圍內,在2進製下,lis長度為k的數的個數,於是想到數字dp,那麼怎麼處理lis呢,以及如何記錄狀態呢 首先看到l和r的大小,要求乙個數的lis,通常想法是把這個數存下來。但是由於...

數字dp HDU 4352 LIS狀態壓縮

題目大意 題意 介紹了電子科大的乙個傳奇學姐,最後幾句話才是題意,這題意思就是給你乙個ll範圍內的區間 l,r 問你在這個區間內最長遞增子串行長度恰為k的數有多少個。在dp過程中,我們要維護lis。而且數字只有0 9,如果你知道怎麼在o n logn 的時間複雜度維護lis,那麼就好辦了。但是這個方...