栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

320. 能量项链(环形,区间dp)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

320. 能量项链(环形,区间dp)

 320. 能量项链 - AcWing题库

分析:可以看成一个环形的区间dp问题

一共有4个珠子,如图有四个标记,可以合并到最后只剩下2个标记,也就是1个珠子为止。

那么最少是需要3个标记才可以继续合并,如果小于三个标记就不用再合并了。

状态表示:所有合并i~j个标记的集合

状态计算/划分依据:根据i~j中间的标记可以划分为不重不漏的j-i-1个集合,由于i,j表示的是标记,所以不能参与合并(dp[i][i]不是一个珠子,不参与运算,所以dp[i][j],j>=i+1)

递推公式是dp[i][k]+dp[k][j],因为断点前一个集合k作为尾标记,后一个集合k作为头标记

i+1作为中断点,合并dp[i][i+1],dp[i+1][j],dp[i][j]=dp[i][i+1]+dp[i+1][j]+w[i]*w[i+1]*w[j]...j-1作为中断点,合并dp[i][j-1],dp[j-1][j],dp[i][j]=dp[i][j-1]+dp[j-1][j]+w[i]*w[j-1]*w[j]

初始化和边界均为0

递推方式:

for(int len=1;len<=n+1;len++)//由于右端点可能是起点,所以<=n+1
//因为最后一个珠子的尾标记是第一个标记
        for(int i=1;i+len-1<=2*n;i++)
        {
            ...
        }

ac代码

#include 
#include 
using namespace std;
const int N=205;
const int INF=0x3f3f3f3f;
int a[N];
int s[N];
int dp[N][N];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i],a[n+i]=a[i];
    
    for(int len=1;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 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/738668.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号