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