Acwing-320.能量项链(区间dp) C++
2020-03-31 19:01
197 查看
1.题目解释:
将一串能量珠合并成一颗能够释放的能量最大值的能量珠。
2.状态转移公式:
dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]+a[i]*a[k+1]*a[j+1])
用dp[i][j]来代表区间(i,j)内所有珠子合成的这一颗能量珠所可能释放的最大能量。
合并珠子即合并左珠dp[i][k]和右珠dp[k+1][j],释放能量a[i]∗a[k+1]∗a[j+1]
最终的能量珠 = 能量最大的左子珠 + 能量最大的右子珠
在区间( i , j )内,能量珠dp[i][j]的头标记为 a[ i ],尾标记为 a[ j+1 ]
用k将区间分成 i~k 和 k+1~j 左右两个部分来代表分左右子珠:
dp[i][k]为左子珠所可能产生的最大能量
dp[k+1][j]为右子珠所可能产生的最大能量
k为左子珠的尾标记,k+1为右子珠的头标记
将最初能量珠的数据存到数组a中,
则第 i 颗能量珠的头标记为a[ i ],尾标记为a[ i + 1 ]
注意:环状问题要断环成链,动态规划所用的数组要开大两倍
本题思路:
1.断环成链
2.区间大小枚举
3.区间起点枚举
4.区间的划分枚举
示例代码:
#include<iostream> #include<algorithm> #define maxn 202 using namespace std; int n,a[maxn],dp[maxn][maxn]={0},ans=0; int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; a[i+n]=a[i];//断环成链 } for(int len=2;len<=n;len++)//合并区间大小枚举 { for(int i=1;i+len-1<2*n;i++)//区间起点枚举 { int j=i+len-1;//区间终点 for(int k=i;k<j;k++)//区间划分枚举:将区间分成 i~k 和 k+1~j 左右两个部分 dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]+a[i]*a[k+1]*a[j+1]);//状态转移公式 } } for(int i=1;i<=n;i++)//枚举所有可能的结果 ans=max(ans,dp[i][i+n-1]); cout<<ans; return 0; }
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 1154 能量项链[区间dp]
- Codevs1154 能量项链 ——2006年NOIP全国联赛提高组 区间dp
- Hrbust 1376 能量项链【区间dp】
- Hrbustoj1376 能量项链 简单区间DP
- [noip2006]能量项链 区间DP
- codevs1154能量项链(环形dp,区间dp)
- SDNU 1178.能量项链(区间dp)
- code(vs) 1154 能量项链 (区间dp)
- P1063 能量项链(区间dp)
- code[vs] 1154能量项链(成环的区间dp)
- 洛谷P1063 能量项链(区间DP)(环形DP)
- tyvj 1056 能量项链 区间dp (很神)
- codevs1154能量项链 环形区间DP 细节
- 洛谷Oj-能量项链-区间DP
- tyvj 1056 能量项链 区间dp
- HPUoj题目1062 能量项链(区间dp)
- HZNU-能量项链【区间dp】
- 1154 能量项链 区间dp(最优矩阵链乘)
- codevs 1048能量项链(区间DP)
- wikioi 1154 - 能量项链 (环形区间dp)