链接
\(\text{POJ - 1651 Multiplication Puzzle}\)
题意
给你一个长度为\(n\)的序列\(a\),现在你将要把,序列\(a\)中除开头和结尾外的所有元素都删除掉,你每次删除一个数\(a_i\)时,你将会得到的分数为\(a_{i-1}*\)\(a_i*a_{i+1}\),你需要获得最少的分数,问这个分数最小为多少。
比如对于序列\({10,1,50,20,5}\),你依次删除\(50、20、1\),得到的分数分别为\(1*50*20、1*20*5、10*1*5\),总共为\(1150\),这样你就能获得最少的分数。
分析
这是一道区间\(\text{DP}\)题目,依旧是枚举区间长度与起点,求出小区间的最优决策,然后得到大区间的解。状态转移方程为:\[dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]+a[i]*a[k]*a[j])\]
\(dp[i][j]\)即为区间\([i,j]\)所能获得的最小分数。
另外,如果是获得最大分数,只需要将数组初始化为0即可。
区间\(dp\)一般基本套路即是枚举区间长度与起点,然后求接小区间解,进而合并得到大区间的解,关键是转移方程。
区间\(dp\)基本模板
1 | for(int len = 1;len<=n;len++){//枚举长度 |
代码
1 |
|