揹包DP 存在異或條件的狀態轉移問題

2022-03-11 14:31:32 字數 959 閱讀 7927

題目鏈結

分析:有大佬說可以用線性基寫,可惜我不會,這是用dp寫的

題目明確說明可到達的位置只與能值有關,和下標無關,我們就可以排個序,這樣每個數可以轉移的區間就是它的所有字尾

我們可以用dp[i][j]表示到達第i個位置,當前耐久度為j是否可行,那就可以根據走或不走兩種情況來安排狀態轉移

也就是說能判斷dp[i]j]能不能到達得看存不存在dp[i-1][j]或者dp[i-1][j^a[i].val](注意,兩次異或同一數等於沒有異或)

另外,排序會存在相等情況,但是題目說過只能到能級比它小的,所以得特判相等的情況

1 #include 2

using

namespace

std;

3const

int inf=1

<<30

;4 typedef long

long

ll;5

const

double pi=acos(-1);6

const

int mod=2000120420010122;7

const

int maxn=3010;8

bool dp[maxn][10000];//

注意第二維不能夠只開到3000

9struct

nodea[3010

];12

bool cmp(const node& a,const node&b)

15int

main()

25if(flag) continue;26

if(a[i].id==n-1)33

}34}35

if(a[i].val==a[i-1

].val)39}

40else44}

45}46 cout<<"

-1\n";

47return0;

48 }

樹形DP和狀壓DP和揹包DP

樹形 dp 和狀壓 dp 雖然在 noip 中考的不多,但是仍然是乙個比較常用的演算法,因此學好這兩個 dp 也是很重要的。而揹包 dp 雖然以前考的次數挺多的,但是現在基本上已經成了人人都能ak的題了,所以也不經常考了。樹形dp 樹形dp這個非常特殊,他好像和是唯一乙個用深搜實現的dp,所以我們學...

NOIP模擬 乘積 狀壓dp 多組揹包

題目大意 選擇不超過k個n以內的正整數相乘,使乘積使乙個無平方因子數,問有多少種取法?每個數只能取一次 1 k,n 500 解題思路 首先可以想到把有平方因子數的數刪了。那問題也就變成了使取得的數的質因數集合無交集。如果質因數個數足夠少,我們就可以狀壓記錄每個質數取還是沒取,但500的範圍太大。不過...

異或的路徑 樹形DP

給一棵 n 個點的樹,1 號節點為根,邊有邊權,令 f u,v 表示 u 節點到 v 節點,路徑上邊權異或值。求 i 1n j 1nf i,j sum sum f i,j i 1n j 1n f i,j 結果對 1000000007 取模。第一行乙個整數 n n 100000 n n leq 100...