首页 > 其他分享 >1839D - Ball Sorting (dp)

1839D - Ball Sorting (dp)

时间:2023-06-04 12:15:15浏览次数:39  
标签:Ball int 1839D 区间 Sorting 升序 代价 dp define

题意:有一个1~n的序列,求放k个0后,最小操作次数 ,使得去掉0后序列升序,
每次操作;可以把与0相邻的数,放到任意位置
思路:因为n最大到500 ,并且求k属于1~n的所有最小代价,所以考虑dp
dp[i][j] ,i表示以ai结尾放j个0的最小代价
最小代价等于去掉以ai结尾升序列后,剩余子段用j个区间覆盖,的最小值(最小值为j个区间的总长度),如果代价等于区间的长度则区间总可以排序成升序
转换公式:a[i-1]<a[i]->dp[i][j]=dp[i-1][j]; //如果后一位大于前一位,则直接加入以前一位结尾的升余列,花费不变。
a[k]<a[i]-> dp[i][j]=min(dp[i][j],dp[k][j-1]+(i-k-1));//这里表示,k+1,到 i-1 这个区间用 i-k-1的价值排序 ,使整体升序

代码:

点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PLL;
#define IOS cin.tie(nullptr)->sync_with_stdio(false);
#define se second
#define fi first
#define mem(a,b) memset(a,b,sizeof a);
#define pri priority_queue<int,vector<int>,greater<int> >
#define low(a,b,c) lower_bound(a,a+b,c)-a;
#define upp(a,b,c) upper_bound(a,a+b,c)-a;
const int N=1e3+7;
const int MOD = (int)1e9 + 7;
int dp[N][N];
int a[N];
 
void solve()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	a[n+1]=99999999;
	for(int i=1;i<=n+1;i++)
	{
		for(int j=0;j<=n+1;j++)
		{
			dp[i][j]=999999999;
		}
	}
	for(int i=1;i<=n+1;i++)
	{
		for(int j=0;j<=n;j++)
		{
			if(a[i-1]<a[i]) dp[i][j]=dp[i-1][j];
			if(j)
			for(int k=0;k<i;k++)
			if(a[k]<a[i]) 
			dp[i][j]=min(dp[i][j],dp[k][j-1]+i-k-1);
		}
	}
	for(int i=1;i<=n;i++) cout<<dp[n+1][i]<<" ";
	cout<<"\n";
}
int main()
{
	IOS;
	int t=1;
	cin>>t;
	while(t--)
	{
		solve();
	}
	return 0;
}




标签:Ball,int,1839D,区间,Sorting,升序,代价,dp,define
From: https://www.cnblogs.com/xxj112/p/17455449.html

相关文章

  • ABC302Ex Ball Collector 题解
    注意到当有那些\((a_i,b_i)\)是确定的时,答案就是将\((a_i,b_i)\)连边后每个连通块的\(\min(|V|,|E|)\)之和。那么这个东西用可撤销并查集维护即可。#include<algorithm>#include<cstdio>usingnamespacestd;constintN=2e5;structEdge{intto,nxt;}e[......
  • CF101234A Hacker Cups and Balls【二分+线段树】
    Description给一个长度为n的排列,对它做m次操作,每次对[l,r]区间内进行升序/降序排序。问最后的序列处于最中心的数是多少(n为奇数)。Solution是一类没有写过的题,参考题解。二分答案,对于当前的mid,将大于等于mid的数设置为1,小于mid的数设置为0。这样一来,叶结点的值......
  • leetcode 682. Baseball Game
    You'renowabaseballgamepointrecorder.Givenalistofstrings,eachstringcanbeoneofthe4followingtypes:Integer(oneround'sscore):Directlyrepresentsthenumberofpointsyougetinthisround."+"(oneround'sscor......
  • AtCoder Beginner Contest 302 H. Ball Collector 题解
    AtCoderBeginnerContest302H.BallCollector题意跳过。可以视作将\(a_i,b_i\)之间连了一条边,然后\(a_i,b_i\)之间只能选一个等价于对于一条边只能选择其一个端点。那么对于只包含树的联通块而言,如果都选择儿子节点,那么会有一个根节点无法被选择上;而对于包含至少一个......
  • AtCoder Beginner Contest 302 Ex Ball Collector
    洛谷传送门AtCoder传送门考虑如果只询问一次怎么做。连边\((a_i,b_i)\),对于每个连通块分别考虑。这是ARC111B,如果一个连通块是树,肯定有一个点不能被选;否则有环,一定能构造一种方案,使得每个点都被选。那么现在对于每个点都要求,考虑dfs时合并当前的\((a_u,b_u)\),并且使用......
  • CodeForces 1827 B Range Sorting
    洛谷传送门CF传送门考虑拆贡献\(i-1\simi\),发现当\([1,i-1]\)的最大值大于\([i,n]\)的最小值时\(i-1\simi\)产生\(1\)的贡献。考虑枚举左端点\(j\),设\(x=\max\limits_{k=j}^{i-1}a_k\)。设\(i\)及\(i\)以后第一个\(<x\)的数位置是\(p\),那么......
  • D1. Range Sorting (Easy Version)(单调栈+思维)
    题目D1.RangeSorting(EasyVersion)题意给一个整数n和一个数组a[1~n]一次次排序操作的代价是,r-l求把所有子数组,排成有序的最小代价和思路easy版本可以用O(\(n^2\))的算法,我们可以枚举左右端点假设一段的最优排序方法如图任意长度的一段序列排序可能是排序多个子......
  • CF1728A Colored Balls: Revisited题解
    去我的Blog观看修改时间:2022/9/11修改了格式与标点修改时间:2022/9/13修改了个别不严谨的语句题目大意有\(n\)种颜色的球,颜色为\(i\)的球为\(cnt_i\)个(\(cnt_1+cnt_2+\dots+cnt_n\)为奇数)。每次从球堆中取出\(2\)个颜色不相同的球,问最后可能剩下哪种颜色的球(输出任意......
  • [ABC132D] Blue and Red Balls
    2023-01-16题目传送门翻译难度&重要性(1~10):3题目来源AtCoder题目算法dp解题思路因为蓝球的数量是固定的,题目让我们求,在取\(i\)次的情况下,有几种方案,首先我们肯定要枚举\(i\),范围就是\(\sum_{i=1}^{k}\)了,然后因为他每次只能取连续的蓝球,于是我们就可以想到用插板......
  • Uva--679 Dropping Balls(二叉树的编号)
    记录23:282023-4-16https://onlinejudge.org/external/6/679.pdfreference:《算法竞赛入门经典第二版》例题6-6二叉树,这里是完全二叉树,使用模拟的方式应该会TLE(虽然我用模拟的方式也TLE了,但不是这个原因,下面会提到原因)不用模拟的方式,转换思路,使用递归的方式去思考。这里......