首页 > 其他分享 >区间dp思想

区间dp思想

时间:2024-04-19 16:26:52浏览次数:20  
标签:思想 删除 int 区间 操作 118 dp

删数

链接:https://www.luogu.com.cn/problem/P2426

题目描述

有 \(N\) 个不同的正整数 \(x_1\), \(x_2\), ..., \(x_N\) 排成一排,我们可以从左边或右边去掉连续的 \(i\) \((1 \le i \le n)\) 个数(只能从两边删除数),剩下 \(N-i\) 个数,再把剩下的数按以上操作处理,直到所有的数都被删除为止。

每次操作都有一个操作价值,比如现在要删除从 \(i\) 位置到 \(k\) 位置上的所有的数。操作价值为 \(|x_i-x_k| \times (k-i+1)\) ,如果只去掉一个数,操作价值为这个数的值。
问如何操作可以得到最大值,求操作的最大价值。

输入格式

第一行为一个正整数 \(N\) ;

第二行有 \(N\) 个用空格隔开的 \(N\) 个不同的正整数。

输出格式

一行,包含一个正整数,为操作的最大值

样例 #1

样例输入 #1

6
54 29 196 21 133 118

样例输出 #1

768

提示

【样例解释和说明】

说明,经过 \(3\) 次操作可以得到最大值,第一次去掉前面 \(3\) 个数:\(54\) 、\(29\) 、\(196\) ,操作价值为 \(426\)。第二次操作是在剩下的三个数 \((21,133,118)\) 中去掉最后一个数\(118\),操作价值为 \(118\)。第三次操作去掉剩下的 \(2\) 个数:\(21\) 和 \(133\) ,操作价值为 \(224\)。操作总价值为 \(426+118+224=768\) 。

【数据范围】

\(3≤N≤100\) ,\(1 \le x_i \le 1000\)









解答

取巧做法

  • 因为一次可以删除前面任意个数和后面任意个数,转换为区间 dp
  • 最终都会是只删除前和后,区间两端,和区间 dp 异曲同工之妙
  • 唯一难受的是既要删除后面,又要删除前面情况,不好讨论
  • 转换为只用删前面,会存在最优解,因为删后面和前面算法一样,值一样,删除的区间 + 前面删除的区间 == 考虑全从前面删,区间 dp 思想考虑这个问题
  • 所以 f[i] 定义为删除到 i 的最优解
#include <iostream>
using namespace std;
const int N = 1010;
int a[N];
int f[N];
int n;

int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> a[i];

	for (int i = 1; i <= n; i++)
	{
		f[i] = a[i] + f[i - 1];
		for (int j = 1; j < i; j++)
			f[i] = max(f[i], f[j - 1] + (i - j + 1) * abs(a[i] - a[j]));
	}

	cout << f[n];
	return 0;
}

中规中矩做法

  • 区间 dp
  • f[i][j]:表示删除 i~j 之间数的方案数,价值最优值
  • 第三层循环即是 i~j 之间枚举中间点
  • 两次三层循环是因为考虑删除前面和后面数两种情况
#include <iostream>
using namespace std;
const int N = 110;
int a[N];
int f[N][N];
int n;

int t(int i, int j) 
{
	if (i == j) return a[i];
	else return abs(a[i] - a[j]) * abs(j - i + 1);
}

int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> a[i];

	for (int i = 1; i <= n; i++)
		for (int j = i; j <= n; j++) 
		{
			for (int k = i; k <= j; k++)
				f[i][j] = max(f[k + 1][j] + t(i, k), f[i][j]);
			
			for (int k = i; k <= j; k++)
				f[i][j] = max(f[i][k] + t(k + 1, j), f[i][j]);
		}
	
	printf("%d", f[1][n]);

	return 0;
}

标签:思想,删除,int,区间,操作,118,dp
From: https://www.cnblogs.com/xingzhuz/p/18146218

相关文章

  • 概率dp四题(青蛙跳、吸血鬼、rating、k小姐的点赞之谜)
    青蛙跳Description有\(n\)个荷叶按顺序依次排列开,编号为\(1\)到\(n\),现在有只青蛙在编号为\(n\)的荷叶上。它现在自由愉快的跳跃,如果他在编号为\(i\)的荷叶上,它会等概率的跳到编号为\([1,i]\)的荷叶上,求它跳到编号为\(1\)的荷叶上的期望步数。Samples53.083333......
  • [dp 小计] wqs 二分
    天才算法!国外叫Alienstrick(外星人trick),真的太强了。其实是因为IOI2016Aliens这道题考了这个算法才开始普及。解决问题wqs二分一般用来解决如下问题。给定\(n\)个数,求强制选\(m\)个的价值最大。如果不是强制选\(m\)个,这类问题很好做。现在问题就是怎么取消......
  • Pyecharts制作动态GDP柱状图
    学习使用pyecharts制作动态柱状图使用csv模块进行csv数据文件处理importcsvfrompyecharts.chartsimportBar,Timelinefrompyecharts.optionsimport*frompyecharts.globalsimportThemeTypedefdealCSVFile():"""读取处理csv数据文件:retu......
  • DP10RF001一款200MHz~960MHz 低功耗(G)FSK/OOK无线收发芯片应用无线遥控工控设备无线
    产品概述.DP10RF001是一款工作于200MHz~960MHz范围内的低功耗、高性能、单片集成的(G)FSK/OOK无线收发机芯片。内部集成完整的射频接收机、射频发射机、频率综合器、调制解调器,只需配备简单、低成本的外围器件就可以获得良好的收发性能。芯片支持灵活可设的数据包格式,支持自动应......
  • 超低功耗Sub-1G收发芯片DP32RF002 M0内核(G)FSK/OOK 无线收发机的32位SoC芯
    产品概述DP32RF002是深圳市动能世纪科技有限公司研制的基于ARMCortex-MO+内核的超低功耗高性能的、单片集成(G)FSK/OOK无线收发机的32位SoC芯片。工作于200~960MHz范围内,支持灵活可设的数据包格式,支持自动应答和自动重发功能,支持跳频操作,支持FEC功能,同时内部集成了完整的射频......
  • 1048 数字加密(前缀和思想)
    暴力(12分)#include<bits/stdc++.h>usingnamespacestd;constintinf=0x3f3f3f3f;#definelllonglonginta[100010];intmain(){ intn; cin>>n; for(inti=0;i<n;i++){ cin>>a[i]; } set<int>st; for(inti=0;i<n;i++){ ......
  • 获取AWS lightsail Windows server RDP密码
    场景创建lightsail的linuxserver时已经生成SSHkey,建立Windows的实例(Instance)时,并未提示输入管理员密码。登录时,找密码登录,提示“DecipheryourpasswordYouusedthe"keyname"keywhenyoucreatedthisinstance.Seetheinstructionstodecipherthepasswordfromthe......
  • 06_QT网络编程之UDP通信
    QT网络编程之UDP通信udp编程​ udp不分客户端和服务器,只需要使用一个类QUdpSocket。代码Udp.pro#-------------------------------------------------##ProjectcreatedbyQtCreator2024-04-13T23:07:41##-------------------------------------------------QT......
  • 换根dp
    换根dp  背景对于一颗无根树而言,假如我们有着把每个节点当成根节点的需求时,那么原先的直接从根节点开始搜索就无法满足我们的时间效率此时我们就需要考虑转换策略研究,有没有什么好的方法能够不去把每个节点当成根节点都跑一次搜索考虑我们手中已有的信息,我们知道跑一次搜......
  • LeetCode 1315. Sum of Nodes with Even-Valued Grandparent
    原题链接在这里:https://leetcode.com/problems/sum-of-nodes-with-even-valued-grandparent/description/题目:Giventhe root ofabinarytree,return thesumofvaluesofnodeswithan even-valuedgrandparent.Iftherearenonodeswithan even-valuedgrandpar......