題幹很智障,意思就是問從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...