首页 > 其他分享 >AT_joi2015ho_b (dp思想)

AT_joi2015ho_b (dp思想)

时间:2024-02-27 10:26:35浏览次数:26  
标签:maxx 思想 int max joi2015ho 4005 long dp

难度2

比较有意思的dp题

首先发现这就是将一个环从中间一点一点剥开的过程。其次观察到joi取时右端点减左端点为偶数,ioi取时为奇数,所以一次一次dp即可。

看到这种题时,发现有环,就要想到双倍延长再模拟一下题意,手玩一下即可

// LUOGU_RID: 117752061
#include<bits/stdc++.h>
using namespace std;
long long n,a[4005],dp[4005][4005],maxx=-1;
long long _max(long long x,long long y){
	if(x>y) return x;
	else return y;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		maxx=_max(maxx,a[i]);
		a[i+n]=dp[i][i]=dp[i+n][i+n]=a[i];
	}
	dp[0][0]=a[0]=a[n];
	dp[2*n][2*n]=a[2*n]=a[1];
	for(int l=2;l<=n;l++){
		for(int i=1;i<=2*n-l;i++){
			int j=l+i-1;
			if(l%2==1){//joi
				dp[i][j]=_max(dp[i+1][j]+a[i],dp[i][j-1]+a[j]);
			}
			else{//
				if(a[i]>a[j+1]) dp[i][j]=_max(dp[i][j],dp[i+1][j]);
				if(a[j]>a[i-1]) dp[i][j]=_max(dp[i][j],dp[i][j-1]);
			}
			maxx=_max(maxx,dp[i][j]);
		}
	}
	cout<<maxx<<endl;
	
	return 0;
}

标签:maxx,思想,int,max,joi2015ho,4005,long,dp
From: https://www.cnblogs.com/wuhupai/p/18036298

相关文章

  • P9588 (ds思想)
    难度2还是比较巧妙的。看到这种操作题,思路基本就是考虑用合适的数据结构去求解每一个操作。在遇到一些比较难搞的操作时可以考虑转换。对于一些删除的操作一定要小心,除非很简单,否则大概率是转换看到操作一,因为这个数据范围想到只用存一个x就可以了看到操作二,是删除,等等看到操......
  • CF482B (拆位思想+实现)
    难度:2看到位运算想到拆位。因为是与所以对于\([l,r]\)区间内在二进制下,如果它是1则\([l,r]\)区间都是1,如果是0则\([l,r]\)区间内至少有1个0。因为是区间所以不难想到用线段树处理,而线段树维护的就是区间内1的个数。考虑如何处理。首先对于q拆位,1就为区间赋值,操作......
  • P3157 (cdq分治思想)
    难度2eeeeeeeee比较有意思的一道题目。一开始看到删除,有一个很经典的trick,就是将删除变成插入,倒序处理。然后发现不会做了。然后巨佬lyc说可以用cdq分治,将时间变为第三个关键字,这样也就不用倒序处理了。考虑求出删除某个数后对逆序对个数产生的贡献,在加入了时间戳之后i,j为逆序对......
  • CF776D(并查集思想)
    难度1em还是一道比较套路的题目。观察发现,如果当\(r_{i}=1\)时他的两把钥匙状态是相同的,当\(r_{i}=0\)时他的两把钥匙状态是不同的,对于这种相同不同的问题可以考虑并差集,状态一样就一样的并在一起,否则就把不一样的并在一起所以以后看见这些问题(a=b+k,a=!b,a=b)都可以用带权并查......
  • ABC283E (dp思想)
    难度1这题看到一点思路也没有,但是看到最小操作数想到二分,dp和贪心,二分答案的check显然不会,贪心不会。发现对于一行,前面的\(i-2\)是不会影响的,这一行也不会影响后面的\(i+2\)行,所以是dp。考虑如何设计状态因为\(i-1\)和\(i+1\)行都会影响,所以设计出来一个dp[i][0/1][0/1][0/1]的东......
  • P10156(dp思想)
    难度2也是比较有意思的一道题。首先发现每个小团体独立,所以对于每个小团体分开直接暴力dp,dp[i][j]表示当前小团体做到第i人,走了j人,然后O(n)转移,加上部分分喜提50pts。为什么要O(n)转移呢,因为我要枚举匹配的两个人然后算贡献。但是对于这种带绝对值的贡献,我们一般都要把绝对值拆掉......
  • CF1928C (数学思想)
    难度3其实是有点虚高的,可能是我这种数学题做的少了。在考试时式子都写出来了,但不知道怎么处理。然后注意一下细节就可以了。懒懒懒。对于xy=k(k为常数)可以直接枚举k的因子,然后看一下限制条件即可。#include<bits/stdc++.h>usingnamespacestd;longlongT,n,x,tot=0;unorde......
  • P6805 (树上最小路径覆盖思想)
    难度3比较有意思的一道题。首先看到题目是求树上最小路径覆盖,自然想到由叶子入手去分析,所以当子树内有偶数个叶子节点时,那么就有两个叶子向上匹配,否则只有一个叶子向上匹配。这个东西可以用树剖维护,线段树维护的是子树内有多少个偶的,相当于一个区间反转一类的东西。细节不算多,但......
  • P1240+P1350+ AT_abc282_g得出的一些dp技巧
    在遇到一些题目在设状态时,前面的状态对后面的有影响,比如在P1240和P1350中前面的放置会对后面的有影响,正常的状态是不行的。以前可能考虑状态压缩,但现在我们可以通过发现前面状态的一些共性,比如在P1240+P1350中前面放了k个車那么一定有k行被占用,所以就不用记录之前那些行被占用了。......
  • P4666 [BalticOI 2011 Day1] Growing Trees题解(平衡树思想)
    自己第一道不看题解写出来的紫题,庆祝一下(没初始化种子导致调了30min)这是一个fhq-treap的题解思路来源:首先看题目,因为是序列上的问题,不难想到是一道数据结构题。首先看到操作C:对于这种操作,我们可以用平衡树解决,具体方法是,将树split成\(<min,min\lex\lemax,>max\)这......