JZOJ 5263. 【NOIP2017模拟8.12A组】分手是祝愿
生活随笔
收集整理的這篇文章主要介紹了
JZOJ 5263. 【NOIP2017模拟8.12A组】分手是祝愿
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Description
Input
Output
Sample Input
2
2
15 19
3
30 40 20
Sample Output
285
2600
Data Constraint
Solution
這題我用的是動態規劃的解法(用類似分治的 DFS 過程實現)。
設 F[l][r] 表示將 [l,r] 這段區間的材料全部合并、變成一份材料的最小花費。
再設 G[l][r] 表示將 [l,r] 這段區間的材料全部合并成一份材料其魔力值。
那么遞歸時,若 F[l][r]>=0 ,說明之前已處理過這個區間,可以直接退出(記憶化)。
否則我們枚舉 i(l≤i≤r) 分別遞歸 [l,i] 和 [i+1,r] 兩個小區間,再合并大的區間。
可以得出轉移方程式:
F[l][r]=Min{G[l][i]?G[i+1][r]+F[l][i]+F[i+1][r]}若成功轉移,則也要更新 G[l][r] 的值:
g[l][r]=(g[l][i]+g[i+1][r])%100那么最終答案即為 F[1][N] ,時間復雜度 O(N3) 。
Code
#include<cstdio> #include<cstring> using namespace std; const int N=101; int f[N][N],g[N][N]; inline int read() {int X=0,w=1; char ch=0;while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();return X*w; } inline int dfs(int l,int r) {if(f[l][r]>=0) return f[l][r];for(int i=l;i<r;i++){int x=dfs(l,i),y=dfs(i+1,r);if(f[l][r]<0 || x+y+g[l][i]*g[i+1][r]<f[l][r]){f[l][r]=g[l][i]*g[i+1][r]+x+y;g[l][r]=(g[l][i]+g[i+1][r])%(N-1);}}return f[l][r]; } int main() {int T=read();while(T--){int n=read();memset(f,-1,sizeof(f));for(int i=1;i<=n;i++) g[i][i]=read(),f[i][i]=0;printf("%d\n",dfs(1,n));}return 0; }總結
以上是生活随笔為你收集整理的JZOJ 5263. 【NOIP2017模拟8.12A组】分手是祝愿的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JZOJ 5275. 水管
- 下一篇: JZOJ 5274. 数组