首页 > 其他分享 >洛谷题单指南-动态规划3-P1063 [NOIP2006 提高组] 能量项链

洛谷题单指南-动态规划3-P1063 [NOIP2006 提高组] 能量项链

时间:2024-05-14 14:08:41浏览次数:13  
标签:node NOIP2006 int 洛谷题 合并 tail 能量 P1063 dp

原题链接:https://www.luogu.com.cn/problem/P1063

题意解读:本质上是一个环形石子合并问题,计算合并产生的最大能量。

解题思路:

对于环形DP问题,可以把环拆开,并复制2倍长度,然后用1~n的区间长度去枚举

1、状态表示

设struct node {int head, tail}用于表示每一个项链节点,其中有头、尾标记值,

node s[2 * N]表示复制2倍长度的项链,

dp[i][j]表示将i ~ j的珠子合并释放的最大能量。

2、状态转移

对于i ~ j范围内每一个分界点k,有

dp[i][j] = max(dp[i][j], dp[i][k] + dp[k+1][j] + s[i].head * s[k].tail * s[j].tail) 说明:将i~j合并的能量等于将i~k合并的能量、将k+1~j合并的能量,将i~k与k+1~j整体合并的能量这三者之和,并取最大值。

3、初始化

对于dp[i][i] = 0,即一个节点不需要合并,无能量。

4、结果

所有dp[i][i+n-1]的最大值。

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 105;
struct node
{
    int head, tail; //珠子的头、尾
};
int n;
int a[N]; //原始数据
node s[2 * N]; //珠子数量扩大2倍,环形dp转换为普通区间dp
int dp[2 * N][2 * N]; //dp[i][j]表示将i ~ j的珠子合并释放的最大能量
int ans;

int main()
{
    //处理输入
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];
    for(int i = 1; i <= n; i++)
    {
        if(i < n) s[i] = {a[i], a[i + 1]};
        if(i == n) s[i] = {a[i], a[1]};
        s[i + n] = s[i];
    }

    //状态转移
    for(int len = 2; len <= n; len++) //枚举区间长度2~n,长度为1的dp[i][i]默认为0
    {
         for(int i = 1; i + len - 1 <= 2 * n; i++) //枚举左端点1~n
         {
            int j = i + len - 1; //计算右端点
            for(int k = i; k < j; k++) //枚举分界点k
            {
                dp[i][j] = max(dp[i][j], dp[i][k] + dp[k+1][j] + s[i].head * s[k].tail * s[j].tail);
            }
         }
    }
   
    for(int i = 1; i <= n; i++)
        ans = max(ans, dp[i][i+n-1]);
    cout << ans;

    return 0;
}

 

标签:node,NOIP2006,int,洛谷题,合并,tail,能量,P1063,dp
From: https://www.cnblogs.com/jcwy/p/18191187

相关文章

  • 洛谷题单指南-动态规划3-P4170 [CQOI2007] 涂色
    原题链接:https://www.luogu.com.cn/problem/P4170题意解读:长度为n的字符串,每次可以将连续一段填为同一个字符,求要填成目标串的最少填涂次数。解题思路:1、状态表示:设s表示目标字符串,dp[i][j]表示将i~j涂成目标"颜色"的最少次数2、状态转移考虑i~j的两端,当i==j,说明只有一个......
  • 洛谷题单指南-动态规划3-P1140 相似基因
    原题链接:https://www.luogu.com.cn/problem/P1140题意解读:两个只包含A、C、G、T4个字符的序列,根据已经定义好的字符-字符的相似度,计算两个序列最大的相似度,两个序列必须每个字符都配对,如果字符不够,可以插入'-'代替。解题思路:本题要解决几个问题:1、状态表示既然有两个序列,设......
  • 洛谷题单指南-动态规划3-P1880 [NOI1995] 石子合并
    原题链接:https://www.luogu.com.cn/problem/P1880题意解读:计算n堆石子合并的最小、最大得分,只不过这n堆石子是环形的,也就是首、尾也相邻,是区间DP的升级版-环形DP问题。解题思路:如果是常规区间DP的方法:对于n堆石子,考察区间的长度范围是1~n先枚举左端点i,范围是1~n再计算右......
  • 洛谷题单指南-动态规划3-P3205 [HNOI2010] 合唱队
    原题链接:https://www.luogu.com.cn/problem/P3205题意解读:给定理想队形,计算初始队形的方案数。解题思路:对于给定理想队形,最后一个人插入有两种可能:从左边插入、从右边插入从左边插入,则意味着前一个数比当前数大,前一个数有可能在左边也有可能在右边从右边插入,则意味着前一个数......
  • 洛谷题单指南-动态规划3-Zuma
    原题链接:https://www.luogu.com.cn/problem/CF607B题意解读:从一组整数中取连续的回文子串,求最少几次可以取完。解题思路:状态表示:设dp[i][j]表示取i~j之间的回文子串所需的最少次数,a[i]表示第i个数状态转移:如果a[i]==a[j],dp[i][j]=dp[i+1][j-1],因为首尾如果相等,其必然可以......
  • 洛谷题单指南-动态规划3-P1775 石子合并(弱化版)
    原题链接:https://www.luogu.com.cn/problem/P1775题意解读:计算合并石子的最小代价,区间DP。解题思路:状态表示:dp[i][j]表示将第i~j堆石子合并的最小代价,m[i]表示第i堆石子质量,s[i]表示前i堆石子质量前缀和状态转移:考虑最后一次合并,设最后一次合并是将i~k合成的一堆与k+1~j合成......
  • 洛谷题单指南-动态规划2-P3147 [USACO16OPEN] 262144 P
    原题链接:https://www.luogu.com.cn/problem/P3147题意解读:将一组数据两两相邻且相同的合并,合并成一个数值+1的数,求合并后的最大值。解题思路:考虑合并后的最大数i,其最后一次必然是由两个i-1合并而来的设dp[i][j]表示以j为左端点,合并最大值为i时的右端点的下一个位置如图:dp[i......
  • 洛谷题单指南-动态规划2-P4310 绝世好题
    原题链接:https://www.luogu.com.cn/problem/P4310题意解读:求最长的子序列长度,使得每相邻两个元素&操作不为0。解题思路:直观来看,可以通过类似最长上升子序列的算法,进行状态转移,但是复杂度为O(n^2),会超时状态表示:dp[i]表示前i个数能产生满足条件的子序列的最长长度状态转移:dp......
  • 洛谷题单指南-动态规划2-P1833 樱花
    原题链接:https://www.luogu.com.cn/problem/P1833题意解读:在有限的时间内,看n株樱花树,第i株樱花树可以看pi次,看每株樱花树耗费时间ti,看每株樱花树一次美学值ci,求最多能看到多少美学值。解题思路:本题实质是一个混合背包问题(pi>0是多重背包,pi=0是完全背包):背包容量:总时间,可以根据......
  • 洛谷题单指南-动态规划2-P1854 花店橱窗布置
    原题链接:https://www.luogu.com.cn/problem/P1854题意解读:F束花依次放入V个花瓶,每个花瓶最多一朵,且花的顺序在花瓶中递增,计算最大的美学值,并且输出每朵花具体放置方案。解题思路:首先想到的的DFS法,对于每一朵花,枚举所有的摆放方案,累加美学值,并记录放置位置,完成一种方案就记录最......