經典問題三.【環形區間dp】 項鍊 nyoj 460
問題描述:
思路:
在瞭解了一點區間dp的基礎上,我們知道要從小區間最優化推導到大區間最優化。
那麼這題也是一樣:dp[i][j] 代表區間i,j最優釋放的能量。
遞推式:dp[i][j] = dp[i][k]+dp[k+1][j]+a[i]*a[j+1]*a[k+1]。
至於環形問題 :我們把陣列擴大一倍,對2*n堆算出dp[i][j],結果列舉dp[i][i+n-1],取最大即可。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
const int INF = 0x3f3f3f3f;
const int N = 110;
int dp[N*2][N*2];// 代表區間i,j最優釋放的能量
int a[N*2];
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i = 0; i < n; i++)
{
scanf("%d",&a[i]);
a[i+n] = a[i];
}
memset(dp,0,sizeof(dp));
for (int len = 1; len < n*2; len++)
{
for(int i = 0; i+len < n*2; i++)
{
int l = i, r = i+len;
for(int k = l; k < r; k++)
dp[l][r] = max(dp[l][r],dp[l][k]+dp[k+1][r]+a[l]*a[r+1]*a[k+1]);
}
}
int maxn = 0;
for(int i = 0; i < n; i++)
maxn = max(maxn,dp[i][i+n-1]);
printf("%d\n",maxn);
}
return 0;
}
相關推薦
經典問題三.【環形區間dp】 項鍊 nyoj 460
問題描述: 思路: 在瞭解了一點區間dp的基礎上,我們知道要從小區間最優化推導到大區間最優化。 那麼這題也是一樣:dp[i][j] 代表區間i,j最優釋放的能量。 遞推式:dp[i][j]
51nod oj 1022 石子歸併 V2 【環形區間DP----四邊形不等式優化】
題目傳送門:1022 四邊形不等式優化: m[i,j]=min{m[i,k]+m[k,j]}(s[i,j-1]≤k≤s[i+1,j]) 當m[i,j]=min{m[i,k]+m[k,j]}(i≤
【洛谷P1063】能量項鍊【區間DP】
題目大意: 題目連結:https://www.luogu.org/problemnew/show/P1063 有 n n
P1063-能量項鍊【區間dp】
正題 題目大意 有n個珠子組成環,每顆珠子的頭尾標記連線,將兩顆珠子合併會產生headi∗headj∗tailjheadi∗headj∗tailj的能量,產生一顆頭標記為頭珠子的頭標記,
經典問題四. 【區間dp】 凸多邊形最優三角形劃分
(區間dp) 凸多邊形最優三角形劃分 問題描述: 思路: 將凸多邊形的點陣列化。發現三角形劃分是滿足區間疊加的。 dp[i][j],1<=i<=j<=N,代表凸子多邊形{v
經典問題二.【區間dp】石子歸併 51nod 1021
51nod 1021 石子歸併(區間dp) 問題描述: N堆石子擺成一條線。現要將石子有次序地合併成一堆。規定每次只能選相鄰的2堆石子合併成新的一堆,並將新的一堆石子數記為該次合併的代價。計算將N堆
經典問題五.【乘號兩邊有正負 區間dp】Polygon poj 1179
題目描述: 思路: 因為n並不大,所以很容易想到列舉一下第一步去掉的邊。 然後展開應為符號和點交雜的一條線,如果符號只有‘+’,那麼用區間dp求其最優解應該很簡單啦,同樣小區間推大區間,dp[i][j] = dp[i][k-1]+dp[k][j].現在
【區間dp】【記憶化搜索】UVALive - 3516 - Exploring Pyramids
main ram eof define mod 劃分 esp using 記憶 f(i,j)=sum(f(i+1,k-1)*f(k,j) | i+2<=k<=j,Si=Sk=Sj)。 f(i+1,k-1)是劃分出第一顆子樹,f(k,j)是劃分出剩下的子樹。 #
NOI2009 二叉查找樹 【區間dp】
pmod 解決 cst sum getc rep 必須 中序遍歷 結點 【NOI2009】二叉查找樹 【問題描述】 已知一棵特殊的二叉查找樹。根據定義,該二叉查找樹中每個結點的數據值都比它左子樹結點的數據值大,而比它右子樹結點的數據值小。另一方面,這棵查找樹中每個結
【基礎練習】【區間DP】codevs1090 加分二叉樹題解
border style script 全部 靈魂 noip 初始 mar 出現 2003 NOIP TG 題目描寫敘述 Description 設一個n個節點的二叉樹tree的中序遍歷為(l,2,3,…,n),當中數字1,2,3,…,n為節點編
uva 10453 【回文串區間dp】
targe 結果 插入 end gpo cout min 輸出 表示 Uva 10453 題意:給定字符串,問最少插入多少個字符使其變成回文串,並任意輸出一種結果。 題解:和Uva 10739類似,這裏是只能增加。類似定義dp[i][j]表示子串Si...Sj變為回文串需要
bzoj 1710: [Usaco2007 Open]Cheappal 廉價回文【區間dp】
枚舉 char cost print 對稱 return space amp clu 只要發現添加一個字符和刪除一個字符是等價的,就是挺裸的區間dp了 因為在當前位置加上一個字符x就相當於在他的對稱位置刪掉字符x,所以只要考慮刪除即可,刪除費用是添加和刪除取min 設f[i
Poj - 3254 Corn Fields 【狀壓DP】(經典)
初始化 include str 結果 沖突 += poj ota scanf 題目鏈接:https://vjudge.net/contest/224636#problem/G 轉載於:https://blog.csdn.net/harrypoirot/article/det
hdu 2167 方格取數 【狀壓dp】(經典)
取出 fff ack 分析 題目 經典 gets bsp ets <題目鏈接> 題目大意: 給出一些數字組成的n*n階矩陣,這些數字都在[10,99]內,並且這個矩陣的 3<=n<=15,從這個矩陣中隨機取出一些數字,在取完某個數字後,該數字周圍8
bzoj 1742: [Usaco2005 nov]Grazing on the Run 邊跑邊吃草【區間dp】
sin can 開始 code \n 所有 class i++ scan 挺好的區間dp,狀態設計很好玩 一開始按套路設f[i][j],g[i][j]為吃完(i,j)區間站在i/j的最小腐敗值,後來發現這樣並不能保證最優 實際上是設f[i][j],g[i][j]為從i開始吃
bzoj 1068: [SCOI2007]壓縮【區間dp】
strlen class char s 合並 pre printf () d+ pri 神區間dp 設f[l][r][0]為在l到r中壓縮的第一個字符為M,並且區間內只有這一個M,f[l][r][0]為在l到r中壓縮的第一個字符為M,並且區間內有兩個及以上的M 然後顯然的轉
poj1179 Polygon【區間DP】
esc false 每次 負數 clas tro ios 結構 常用 Polygon Time Limit: 1000MS Memory Limit: 10000K Total Submissions:6633 Accepted: 2834 De
poj1191 棋盤分割【區間DP】【記憶化搜索】
print ron pri plm time ted hang def 空格 棋盤分割 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16263 Accepted: 5812
BZOJ4350: 括號序列再戰豬豬俠【區間DP】
Description 括號序列與豬豬俠又大戰了起來。 眾所周知,括號序列是一個只有(和)組成的序列,我們稱一個括號序列S合法,當且僅當: 1.( )是一個合法的括號序列。 2.若A是合法的括號序列,則(A)是合法的括號序列。 3.若A,B是合法的括號序列,則AB是合法的括號序列。 我們考慮mat
BZOJ 1742 [Usaco2005 nov]Grazing on the Run 邊跑邊吃草【區間DP】
這道題就當做複習區間DP的板子題吧QvQ f [ i