題目鏈結
分析:有大佬說可以用線性基寫,可惜我不會,這是用dp寫的
題目明確說明可到達的位置只與能值有關,和下標無關,我們就可以排個序,這樣每個數可以轉移的區間就是它的所有字尾
我們可以用dp[i][j]表示到達第i個位置,當前耐久度為j是否可行,那就可以根據走或不走兩種情況來安排狀態轉移
也就是說能判斷dp[i]j]能不能到達得看存不存在dp[i-1][j]或者dp[i-1][j^a[i].val](注意,兩次異或同一數等於沒有異或)
另外,排序會存在相等情況,但是題目說過只能到能級比它小的,所以得特判相等的情況
1 #include 2using
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...