区间DP
1.区间dp的定义
在区间上进行动态规划,求解某一个区间的状态的值。主要通过合并小区间的状态进而求出整个大区间状态的值的dp算法。
2.石子合并
2.1 思路
2.2 时间复杂度分析
O(n^3) :总共 n*n种状态,每一种状态计算量为n.
2.3 AC代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=310;
int n,a[N],s[N],f[N][N];
signed main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];//石子质量
for(int i=1;i<=n;i++) s[i]=s[i-1]+a[i];//计算质量和
for(int len=2;len<=n;len++)//循环区间长度
for(int i=1;i+len-1<=n;i++)//循环区间左端点
{
int j=i+len-1;
f[i][j]=1e8;
//循环决策
for(int k=i;k<j;k++) f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+s[j]-s[i-1]);
}
cout<<f[1][n]<<endl;
return 0;
}
3.环形石子合并
3.1思路
n个石子形成了一个环形区间,我们可以考虑将环形转化为线形。环形区间有n个石子,需要合并n-1次最后合并为一个。把石子等价为点,把合并等价为两点间连线,题目等价为环形排列的n个点内连n-1条线。而一个环形区间的n个点相邻两个点之间连一条线,可以连n条。 所以环形排列的n个点中有两个点的点对之间没有连线。有序环形排列的n个点中有n种两个点的点 对,