ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【区间 环形 DP】P1880 [NOI1995] 石子合并

2021-05-02 23:01:09  阅读:177  来源: 互联网

标签:return int NOI1995 sum 合并 P1880 DP


【区间DP】P1880 [NOI1995] 石子合并

题目

在这里插入图片描述

思路

典中典,不过初次写的时候还是写得漏洞百出,个人感觉记忆化越来越香了,处理边界轻松很多。
这题要和合并果子区分,合并果子是任意选两个来合并,直接优先队列维护最值即可,这题必须是相邻合并
然后要注意这题说是圆形操场上的,所以是个环形DP,环形DP如何处理?
常见的处理方式是赋值粘贴弄成两倍,然后变成n个非环形问题即可,所有的都要开2倍别漏掉
区间DP比较容易想,f[l,r]为l,r区间合并成一堆的花费。
然后枚举分隔点即可
状态转移显而易见: f ( l , r ) = f ( l , k ) + f ( r , k ) + s u m [ r ] − s u m [ l − 1 ] f(l,r)=f(l,k)+f(r,k)+sum[r]-sum[l-1] f(l,r)=f(l,k)+f(r,k)+sum[r]−sum[l−1]

记忆化求最值的时候有几个需要注意的点


int get_min(int l,int r)
{
	if(f[l][r])return f[l][r];
	if(l==r)return f[l][r]=0;
	int tmp=1e9+7;//设置临时变量
	for(int i=l;i<r;i++)
		tmp=min(tmp,get_min(l,i)+get_min(i+1,r)+sum[r]-sum[l-1]);//不能在这里return了
	return f[l][r]=tmp;	//在这里return
}

代码

// Problem: P1880 [NOI1995] 石子合并
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1880
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// FishingRod

#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
typedef long long LL;
typedef pair<int,int> PII;
//#define MULINPUT
/*DATA & KEY

*/
int T;
const int N=205;
int n;
int a[2*N],f[N][N],g[N][N],sum[N];

int get_min(int l,int r)
{
	if(f[l][r])return f[l][r];
	if(l==r)return f[l][r]=0;
	int tmp=1e9+7;
	for(int i=l;i<r;i++)
		tmp=min(tmp,get_min(l,i)+get_min(i+1,r)+sum[r]-sum[l-1]);
	return f[l][r]=tmp;	
}

int get_max(int l,int r)
{
	if(g[l][r])return g[l][r];
	if(l==r)return g[l][r]=0;
	int tmp=0;
	for(int i=l;i<r;i++)
		tmp=max(tmp,get_max(l,i)+get_max(i+1,r)+sum[r]-sum[l-1]);
	return g[l][r]=tmp;
}

void solve(int C)
{
	//NEW DATA CLEAN
	
	//NOTE!!!
	int n;cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i],a[i+n]=a[i];
	for(int i=1;i<=2*n;i++)sum[i]=sum[i-1]+a[i];
	get_min(1,2*n);get_max(1,2*n);
	int ans1=1e9+7,ans2=0;
	for(int i=1;i<=n;i++)
	{
		ans1=min(f[i][n+i-1],ans1);
		ans2=max(g[i][n+i-1],ans2);
	}
	cout<<ans1<<endl<<ans2;
}

int main()
{
	#ifdef MULINPUT
		scanf("%d",&T);
		for(int i=1;i<=T;i++)solve(i);
	#else
		solve(1);
	#endif
	return 0;
}

标签:return,int,NOI1995,sum,合并,P1880,DP
来源: https://blog.csdn.net/qq_39354847/article/details/116357947

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有