首页 > 其他分享 >P2824 [HEOI2016/TJOI2016] 排序

P2824 [HEOI2016/TJOI2016] 排序

时间:2024-12-06 12:24:51浏览次数:9  
标签:const int P2824 TJOI2016 HEOI2016 max

P1136 迎接仪式

动态规划好题

状态设计:

我们认为z是1,j是0,产生贡献的是01对

我们用状态 \(f[i][j][k][0/1]\) 表示考虑到第 \(i\) 位,进行了 \(j\) 次将1变成0的操作和 \(k\) 次将0变成1的操作,操作过后第 \(i\) 位为 \(0/1\) 时的答案

状态转移:

然后我们就有方程:

\(a_i=1:\)

\( f[i][j][k][1]=max(f[i-1][j][k][0]+1,f[i-1][j][k][1]); \)

$ f[i][j][k][0]=max(f[i-1][j-1][k][0],f[i-1][j-1][k][1]);
$

\(a_i=0:\)

\( f[i][j][k][0]=max(f[i-1][j][k][0],f[i-1][j][k][1]); \)

\( f[i][j][k][1]=max(f[i-1][j][k-1][0]+1,f[i-1][j][k-1][1]); \)

当且仅当 \(j=k\) 时答案合法

然后这题就做完了

Code:

#include<bits/stdc++.h>
const int N=505;
const int K=105;
const int inf=1e9;
using namespace std;
int f[N][K][K][2],a[N];
int n,m,ans;
char c[N];
void init()
{
	for(int i=0;i<N;i++)for(int j=0;j<K;j++)for(int k=0;k<K;k++)f[i][j][k][0]=f[i][j][k][1]=-inf;
}
void work()
{
	init();
	cin>>n>>m;
	scanf("%s",c+1);
	f[0][0][0][1]=0;
	for(int i=1;i<=n;i++)
	{
		bool now = c[i]=='z';
		for(int j=0;j<=m;j++)
		{
			for(int k=0;k<=m;k++)
			{
				//01	
				//1:
				if(now)
				{
					f[i][j][k][1]=max(f[i-1][j][k][0]+1,f[i-1][j][k][1]);
					if(j)f[i][j][k][0]=max(f[i-1][j-1][k][0],f[i-1][j-1][k][1]);
				}
				//0:
				else
				{
					f[i][j][k][0]=max(f[i-1][j][k][0],f[i-1][j][k][1]);
					if(k)f[i][j][k][1]=max(f[i-1][j][k-1][0]+1,f[i-1][j][k-1][1]);
				}
			}
		}
	}
	for(int i=1;i<=m;i++)ans=max({ans,f[n][i][i][0],f[n][i][i][1]});
	printf("%d",ans);
}
int main()
{
	//freopen("welcome.in","r",stdin);
	//freopen("welcome.out","w",stdout);
	work();
}

标签:const,int,P2824,TJOI2016,HEOI2016,max
From: https://www.cnblogs.com/LG017/p/18590491

相关文章

  • P2825 [HEOI2016/TJOI2016] 游戏 与 P10945 Place the Robots
    本文中的机器人同炸弹,主要是题目描述不同,两道题目做法是本质相同的。思路:先说一下没有墙怎么办,那么当一个位置放了机器人之后,这个机器人所在的行和列是不能继续放置的。那么发现行和列几乎是独立的,考虑建二分图,若\((i,j)\)能放一个机器人,那么给\(i\toj\)建一条边。那么......
  • 洛谷 P2824 [HEOI2016/TJOI2016] 排序(二分,线段树)
    传送门解题思路据说是经典思路:把多次排序转化成二分+01序列。首先二分所求位置的数字是啥,将大于mid的数字变成1,将小于等于mid的数字变成0。这样在排序的时候就相当于统计区间里的1的个数(区间和),然后区间全部变成0或者1。也就是区间修改,区间求和,线段树可以实现。AC代码#inclu......
  • P2824 [HEOI2016/TJOI2016] 排序
    简要题意给定一个长度为\(n\)的排列\(a\),有\(m\)次操作:将\([l,r]\)从小到大排序将\([l,r]\)从大到小排序求\(m\)次操作后\(a_q\)的值。\(n,m\leq10^5\)思路首先这种排序的数据结构没有什么想法,根本原因是因为值太多了。但是我们观察到这是一个排列,这对于解......
  • P2824 [HEOI2016/TJOI2016] 排序 与 ABC297_g Range Sort Query 题解
    洛谷题目链接:排序abc题目链接:Atcoder或者洛谷两道差不多的题拿出来说说。本题有双\(\log\)做法,也有单\(\log\)做法,都讲讲。双\(\log\)做法对于第一个题而言,询问最终\(pos\)位置上的数为多少,那么这个问题是否具有单调性?这个是很有意思的点,我们考虑只关注某个数\(x\)......
  • P4093 [HEOI2016/TJOI2016] 序列 题解
    题目链接:序列对于LIS问题,很显而易见的有dp方程为:\[dp_i=\max{dp_j}+1\(j<i,a_j\lea_i)\text{dp表示以某个位置结尾的最长LIS}\]本题考虑到对于转移的两位置,如果能从\(j\rightarrowi\),那么在以上条件成立的基础情况下,我们由于可以更改二者中的任意一个值(因为同一......
  • [HEOI2016TJOI2016]排序
    P2824[HEOI2016/TJOI2016]排序直接模拟复杂度爆炸,有观察到它只要求一个数。思维十分清奇。我们先考虑一个序列,如果全是0/1,该怎么做。发现这个问题很好做,修改区间时只需要先查询一的个数,然后将前面/后面全部置1,其他置0。然后我们考虑怎么转化。发现可以二分答案,对于小于mi......
  • P2824 [HEOI2016/TJOI2016] 排序
    针对区间排序,显然能够上值域线段树类似,但这里有个更强的做法。如果能转化成01序列,那么一个区间排序的时候,只需区间询问1的个数+区间修改就可以了。因为是排列,很清晰的二分一个mid,把大于等于它的设为1,小于它的设为0,再跑上面的算法,最后check一下询问位置是否为1即可。单调性?感性......
  • 题解 [HEOI2016/TJOI2016] 排序
    题目链接看到这道题按照套路首先想到二分答案(即二分\(q\)位置上的数,记作\(mid\))。再按照套路将大于\(mid\)的数字设为\(1\),将等于\(mid\)的数设为\(2\),小于\(mid\)的数字设为\(0\)。那么对于区间\([l,r,0]\)操作,应该先讲\(0,1,2\)的数量找出来,然后按照从小到大......
  • P2824 排序(二分答案加线段树)
    传送门很巧妙的一个题直接排序肯定会\(T\)飞我们发现问题只有一个:第\(q\)个位置上的数字不难想到从这里入手,二分答案,考虑第\(q\)个位置上的数字是什么,不妨设他为\(x\)然后把大于等于\(x\)的数变成\(1\),小于\(x\)的数变为\(0\),把他转换为一个\(01\)排序问题:对于区间\([l,r]\)......
  • P2824 排序(二分答案)
    题目简述给出一个$1$到$n$的排列,现在对这个排列序列进行$m$次局部排序,排序分为两种:0lr表示将区间$[l,r]$的数字升序排序1lr表示将区间$[l,r]$的数字降序排序这里是对下标在区间$[l,r]$内的数排序。最后询问第$q$位置上的数字。分析&性质申必题,对......