HDU4352 lis 狀壓 數字dp

2021-07-26 02:31:58 字數 1267 閱讀 2268

題幹很智障,意思就是問從l到r裡lis為k的數有幾個

首先從0到9一共十個數,那麼最長不能超過10

dp陣列開乙個狀態,位數,k這樣的三維就夠

狀態是狀態壓縮的狀態

你可以用狀態壓縮來表達lis的陣列

有點取巧了,我看別人的題解都是兩維,lis部分用的nlgn方法

我第一次看見tle以後直接開了第三維記錄了k爆草過去了…

因為早就料到他的測試樣例裡肯定有重複的和k超過10的

你看他的t有一萬這麼大不重複就怪了

所以特判了k超過十的直接返回0

然後dp陣列本身只需要初始化一次…下次k只要一樣的就能用上一輪的結果

回頭再寫下nlgn的

t(t<=10000)0

#include

#include

#include

#include

using

namespace

std;

int bte[100];

long

long k;

long

long dp[1

<<12][20][10];

long

long chai(long

long n)

return js;

}long

long dfs(int weishu, int biaoji, long

long zhuangtai,int qd)

if (biaoji&&dp[zhuangtai][weishu][k] != -1)return dp[zhuangtai][weishu][k];

int bianjie = biaoji ? 9 : bte[weishu];

long

long sum = 0;

for (int a = 0;a <= bianjie;a++)

}sum += dfs(weishu - 1, !(biaoji == 0 && a == bianjie&&bianjie == bte[weishu]), xjt,1);}}

}if (biaoji)dp[zhuangtai][weishu][k] = sum;

return sum;

}long

long jieju(long

long n)

return dfs(bte[0], 0, 0,0);

}int main()

return

0;}

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

求區間範圍內最長上公升子串行數字k的數字有多少個 首先由數字dp引入思路,dp轉移方程為 dfs pos,status.累加dfs pos 1,stautselse 可備忘錄記錄的dp陣列為 dp pos status k 之所以要備忘錄k,是為了滿足不同k的訪問 status記錄的是開頭數字到po...

hdu 4770 狀壓 列舉

長記性了,以後對大陣列初始化要注意了!140ms 原來是對vis陣列進行每次初始化,每次初始化要200 200的複雜度 一直超時,發現沒必要這樣,直接標記點就行了,只需要乙個15的陣列用來標記,vis陣列用來對映座標就行了 然後就是暴力加了一點優化,下面沒有加優化。include include d...

HDU2489 狀壓列舉

題意 給你n個點的圖,然後讓你在圖里挑m個點,達到sumedge sumnode最小 思路 由於資料範圍小,狀壓列舉符合m個點的狀態,我是用vactor存了結點位置,也記錄了結點的sum值,然後跑一發最小生成樹就可以知道sumedge,這裡判斷可以利用乘法,然後更新乙個狀態就好了 include u...