動態dp 板子

2022-04-29 23:24:11 字數 1323 閱讀 8905

瞎扯兩句吧

先從序列上理解,維護鏈的最大獨立集。

放在樹上的話,兒子都可以轉移,把輕兒子的轉移放在子鏈鏈頭更新,然後每條鏈都處理成序列就行了。

注意一點,因為維護的是序列,所以單點存放的矩陣是只含輕兒子和自己的貢獻,相當於把輕兒子的子樹縮給了自己,而重兒子維護的東西是通過線段樹上維護的區間貢獻過來的。

咕咕模板,最大全獨立集

code:

#include #include #include using std::max;

const int n=1e5+10;

const int inf=0x3f3f3f3f;

int n,m,v[n];

int read()

while(isdigit(c))

return x*f;

}int head[n],to[n<<1],next[n<<1],cnt;

void add(int u,int v)

int dfn[n],top[n],bot[n],siz[n],ha[n],f[n],ws[n],dfsclock,dp[n][2],len;

void dfs1(int now)

}void dfs2(int now,int anc)

struct matrixmx[n<<2],upt[n];

matrix operator *(matrix a,matrix b)

#define ls id<<1

#define rs id<<1|1

void build(int id,int l,int r)

; return;

}int mid=l+r>>1;

build(ls,l,mid),build(rs,mid+1,r);

mx[id]=mx[ls]*mx[rs];

}matrix query(int id,int l,int r,int l,int r)

void change(int id,int l,int r,int p)

int mid=l+r>>1;

if(p<=mid) change(ls,l,mid,p);

else change(rs,mid+1,r,p);

mx[id]=mx[ls]*mx[rs];

}void modify(int now,int w)

}int main()

{ n=read(),m=read();

for(int i=1;i<=n;i++) v[i]=read();

for(int u,v,i=1;i2019.1.2

數字dp 板子題

題目傳送 存乙個狀態就可以了,用來判斷前一位是不是6的情況 具體看 注釋 ac include inline long long read while c 0 c 9 return x s using namespace std define newnode treenode malloc size...

不要62(數字dp板子題)

傳送門 hdu 2089 杭州人稱那些傻乎乎粘嗒嗒的人為62 音 laoer 杭州交通管理局經常會擴充一些的士車牌照,新近出來乙個好訊息,以後上牌照,不再含有不吉利的數字了,這樣一來,就可以消除個別的士司機和乘客的心理障礙,更安全地服務大眾。不吉利的數字為所有含有4或62的號碼。例如 62315 7...

石子合併(區間DP板子題)

設有n堆石子排成一排,其編號為1,2,3,n。每堆石子有一定的質量,可以用乙個整數來描述,現在要將這n堆石子合併成為一堆。每次只能合併相鄰的兩堆,合併的代價為這兩堆石子的質量之和,合併後與這兩堆石子相鄰的石子將和新堆相鄰,合併時由於選擇的順序不同,合併的總代價也不相同。例如有4堆石子分別為 1 3 ...