發表文章

目前顯示的是有「DP優化」標籤的文章

[TIOJ] 1331. 索拉數列

題目連結: http://tioj.infor.org/problems/1331 看一眼大概就可以發現這就是一個經典的矩陣優化DP的題目,稍微算一下後得到轉移矩陣$ \begin{bmatrix} 0 & x \\ 1 & y \\ \end{bmatrix} $,所以要求$a_n$其實就是算$ \begin{bmatrix} a_0 & a_1 \\ \end{bmatrix} \times \begin{bmatrix} 0 & x \\ 1 & y \\ \end{bmatrix}^n = \begin{bmatrix} a_n & a_{n+1} \\ \end{bmatrix}$ ,然後冪次的部分用快速冪解決。 #include <bits/stdc++.h> using namespace std; typedef long long lld; typedef unsigned long long llu; const llu mod = 1LL<<32; auto A = new llu[2][2]; auto B = new llu[2][2]; auto C = new llu[2][2]; auto F = new llu[2][2]; void mTimes(llu[2][2],llu[2][2],llu[2][2],int,int,int); int main(){ ios_base::sync_with_stdio(0);cin.tie(0); lld n, a, b, x, y; while(cin>>n, n>=0){ cin>>a>>b>>x>>y; F[0][0]=a; F[0][1]=b; A[0][0]=0; A[0][1]=x; A[1][0]=1; A[1][1]=y; B[0][0]=...

[TIOJ] 1407. Striker的秘密 - EXTREME

題目連結: http://tioj.infor.org/problems/1407 跟 TIOJ 1387 一樣,只是把N改大一點。不過如果C在大一點就要好好的對餘數作單調隊列優化。 #include <bits/stdc++.h> using namespace std; typedef pair<int,int> PII; #define PB push_back #define FF first #define SS second vector<PII> stones; int dp[1000005]; int main(){ ios_base::sync_with_stdio(0);cin.tie(0); int n, t;cin>>n; for(int i=0;i<n;i++){ int w,m,c,j;cin>>w>>m>>c; for(j=1;j<=c;c-=j, j<<=1) stones.PB({w*j, m*j}); if(c) stones.PB({w*c, m*c}); } for(int i=1;i<=t;i++) dp[i]=0; cin>>t; for(int i=1;i<=int(stones.size());i++) for(int j=t;j-stones[i-1].FF>=0 && j>=1;j--) dp[j] = max(dp[j-stones[i-1].FF] + stones[i-1].SS, dp[j]); int ans=0; for(int i=1;i<=t;i++) ans = max(ans, dp[i]); cout<<ans...

[TIOJ] 1387. Striker的秘密

題目連結: http://tioj.infor.org/problems/1387 經典的多重背包優化,其實本題可以裸著當背包寫就好了,不過我還是寫了一個logC的優化。這優化的想法大概是想說你並不需要完整的C組,而只要把他分成2的冪次跟餘數即可有所有數量的可能了。 #include <bits/stdc++.h> using namespace std; typedef pair<int,int> PII; #define PB push_back #define FF first #define SS second vector<PII> stones; int dp[10005]; int main(){ ios_base::sync_with_stdio(0);cin.tie(0); int n, t;cin>>n; for(int i=0;i<n;i++){ int w,m,c,j;cin>>w>>m>>c; for(j=1;j<=c;c-=j, j<<=1) stones.PB({w*j, m*j}); if(c) stones.PB({w*c, m*c}); } for(int i=1;i<=t;i++) dp[i]=0; cin>>t; for(int i=1;i<=int(stones.size());i++) for(int j=t;j-stones[i-1].FF>=0 && j>=1;j--) dp[j] = max(dp[j-stones[i-1].FF] + stones[i-1].SS, dp[j]); int ans=0; for(int i=1;i<=t;i++) ans = ...

[TIOJ] 1745. [APIO '10] Commando

題目連結: http://tioj.infor.org/problems/1745 這題應該不難想到DP的方式\[ f(x) =ax^2+bx+c \\ dp[i] = \max_{0 \leq j #include <bits/stdc++.h> using namespace std; typedef long long lld; #define INF 2147483647 #define N 1000000 lld a,b,c; lld arr[N+5], sm[N+5], dp[N+5]; inline bool detectBeyond(int,int,int); inline lld f(int,int); int main(){ ios_base::sync_with_stdio(0);cin.tie(0); int n;cin>>n; cin>>a>>b>>c; for(int i=1;i<=n;i++){ cin>>arr[i]; sm[i]=arr[i]+sm[i-1]; } for(int i=1;i<=n;i++)dp[i]=-INF; deque<int> dq; dq.push_back(0); for(int i=1;i<=n;i++){ while(dq.size()>1 && f(dq[0], i) < f(dq[1], i)) dq.pop_front(); dp[i] = f(dq[0], i) + a*sm[i]*sm[i]+b*sm[i]+c; while(dq.size()>1 && detectBeyond(dq[dq.size()-2], dq[dq.size()-1], i)) dq.pop_back();...

[TIOJ] 1639. 尋找蘿莉第二彈

題目連結: http://tioj.infor.org/problems/1639 本題是校隊題,那時我根本不知道題目在幹嘛,後來被雷(解析)了後才知道原來是個裸最佳二元樹,不過要套四邊形不等式優化,但我根本不知道最佳二元樹的$O(N^3)$作法該怎麼做ww,想了很久加被雷後才知道,因為給定一棵最佳二元樹,其左右子樹也皆為最佳二元樹,所以可以列出$dp[l][r] = \displaystyle\min_{\forall l \leq k \leq r}(dp[l][k]+dp[k][r])+sum[l][r], $的轉移式,這時就可以$O(N^3)$的拿到大部分測資,不過最後那組要套2D/1D四邊形優化,簡述一下:對於一條轉移式$dp[i][j] = \displaystyle\min_{\forall i \leq k \leq j}(dp[i][k]+dp[k][j])$,定義$K_{i,j}$為會使dp[i][j]最小的那個k,則$K_{i,j-1} \leq K_{i,j} \leq K_{i+1,j}$,但是要如何運用這神奇的性質呢?那顯然要讓你的j-i值由小到大出現,不過可以其實也可以偷懶,就是從第一維從後跑回來,第二維再負責維持使j-i由小到大就好。然後就照著做就好www這應該是最簡單的四邊形不等式優化了吧XD,仔細觀察: \[\cdots \leq \cdots \leq \cdots \\ K_{i-2,j-3} \leq K_{i-2,j-2} \leq K_{i-1,j-2} \\ K_{i-1,j-2} \leq K_{i-1,j-1} \leq K_{i,j-1} \\ K_{i,j-1} \leq K_{i,j} \leq K_{i+1,j} \\ K_{i,j+1} \leq K_{i+1,j+1} \leq K_{i+2,j+1} \\ K_{i+2,j+1} \leq K_{i+2,j+2} \leq K_{i+3,j+2} \\ \cdots \leq \cdots \leq \cdots \] 你會發現每個元素都只會出現兩遍,也就是說總轉移最多O(2N),所以在轉移時的複雜度就變成均攤$O(1)$了!! #include <bits/stdc++.h> using namespace std; t...