【区间DP】P1063 [NOIP 2006 提高组] 能量项链
题目
P1063 [NOIP 2006 提高组] 能量项链
分析
重点:
- 处理环问题,采用倍增策略
- 将该题简单抽象成三个数合并
注意:对于倍增后的序列:2 3 5 10 2 3 5 10 我们研究的长度为n+1,若从2开始就到2结束,即:2 3 5 10 2,长度为n+1,这就叫成环。若从3开始就到3结束,即:3 5 10 2 3。
由此分析可见,本题可以抽象成三个数的石子合并问题,就得到了区间DP的解题思路。用区间的左右端点来描述状态,通过小区间的解来推导出大区间的解。
代码
#include<iostream>using namespace std;typedef pair<int,int> PII;const int N = 210;int n,f[N][N];int a[N];int main()
{cin >> n;for(int i=1;i<=n;i++) {cin >> a[i];a[i+n] = a[i]; //倍增解决环问题}//枚举长度(最大是n+1) for(int len=3;len<=n+1;len++) {//枚举左端点 for(int i=1;i+len-1<=2*n;i++){ int j = i + len - 1; //右端点 //枚举分割点for(int k=i+1;k<j;k++){f[i][j] = max(f[i][j],f[i][k] + f[k][j] + a[i] * a[k] * a[j]);} }}int ret = 0;for(int i=1;i<=n;i++){ret = max(ret, f[i][i+n]);}cout << ret;return 0;
}