首页 > 其他分享 >100 DP

100 DP

时间:2024-01-25 09:37:19浏览次数:30  
标签:10 int 魔法 j1 j2 100 now DP

NO临时剪贴板

- 1.23 P1103 书本整理

题目简化 给定一个数列,和一个数字k,有k次机会将数列中的数字减一。求相邻差值之和最少。

其实如果考虑扔掉k本书,操作起来感觉非常的麻烦。如果考虑留下(n-k)书,再求差值是否会更简便呢?

f[i][j]=min(f[i][j],f[k][j-1]+abs(a[i]-a[k]));

考虑如何排书——
前i本书,选j本书。考虑摆在哪类书的下边。


- 1.178~1.19 P1564 膜拜

思路简述: 考虑前i个人分配机房,需要的最小机房数。再根据题目要求(要么保证整个机房都是同一位神牛的膜拜者,或者两个神牛的膜拜者人数差不超过 m)设计状态转移方程。

f[i]=min(f[i],f[j]+1)(abs(s1-s2)<=m||s1t||s2t)
//t为ij+1段的人数,s1为ij+1段膜拜牛1的人,s2为i~j+1段膜拜牛2的人


- 1.12 P3842 [TJOI2007] 线段

/*死掉的代码与死掉的思路
	f[i][j] 表示停在第i行,第j列,且完成改行的线段任务的最短路径
	f[i][j1]=min(f[i-1][j2]+cost,f[i][j1])
	cost为完成任务的话费,1<=j1<=n&&1<=j2<=n
但仔细思考后就会发现,cost很难求,并且没必要停留在非线段覆盖的点上*/
#include<bits/stdc++.h>
using namespace std;
const int N=2*1e4;
int n,l[N],r[N],f[N][N];
int ans=0x3f3f3f3f;
int work(int i,int j1,int j2){
	int cost=1;
	int a=l[i],b=r[i];
	int s=min(j1,j2),t=max(j1,j2);
	if(s<=a) cost+=abs(b-s)+abs(b-t);
	else if(s<=b) cost+=abs(s-a)+abs(b-a)+abs(b-t);
	else cost+=abs(s-a)+abs(t-a);
	return cost;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>l[i]>>r[i];
	
	memset(f,0x3f3f3f3f,sizeof(f));
	f[1][1]=0;
	for(int j=1;j<=n;j++){
		int cost=(j-1);
		if(j<=r[1]) cost+=(r[1]-j)*2;
		f[1][j]=cost;
	}
	for(int i=2;i<=n;i++){
		for(int j1=1;j1<=n;j1++){
			for(int j2=1;j2<=n;j2++){
				if(f[i][j1]>f[i-1][j2]){
					int tmp=f[i-1][j2]+work(i,j1,j2);
				//	if(f[i][j1]>tmp){
				///	cout<<i<<' '<<j1<<' '<<j2<<' '<<tmp<<' '<<work(i,j1,j2)<<endl;
				//	}
					f[i][j1]=min(f[i][j1],tmp);	
				}
				
			}
	////		cout<<f[i][j1]<<endl;
		///	if(i==n) ans=min(f[n][j1],ans);
		}
	}
///	cout<<ans;
	for(int j=1;j<=n;j++){
		ans=min(ans,f[n][j]);
	}
	cout<<ans;
	return 0;
}

思考简化掉一下无用的状态空间。
f[i][0/1]表示第i行的完成第i条线段,结束时站在左端点(0)右端点(1)的最优情况
下图是四种转移的情况。
四种cost计算情况


- 1.11 P1095 [NOIP2007 普及组] 守望者的逃离

二维DP

$$f_{i,j}= \max \begin{cases} f_{{i-1},{j-4}} \ f_{{i-1},{j}}+7 \ f_{i,j+10}+60 \end{cases}$$

二维dp 代码记录

一维DP

因为题目要求最短的时间,最长的路程。所以如果能使用魔法就尽量使用魔法。但是如果只使用魔法的话,会发现最后的时间里恢复的能量值是不足以使用魔法的,那休息还不如走两步路呢。于是我们就想到用 $f_i$ 来表示第i秒的走的的最长的路程。先处理好,如果只用魔法能走得最长路。在此基础上在处理走路的情况。
//不需要考虑先走路还是先用魔法的问题,因为无论顺序怎么样,到终点花费的时间是一样的。(无后效性)

#include<bits/stdc++.h>
using namespace std;
int m,s,t;
int f[1000006];
int main(){
	cin>>m>>s>>t;
	for(int i=1;i<=t;i++){
		if(m>=10){
			m-=10;
			f[i]=f[i-1]+60;
		}
		else{
			m+=4; f[i]=f[i-1];
		} 
	}
	for(int i=1;i<=t;i++){
		f[i]=max(f[i],f[i-1]+17);
		if(f[i]>=s){
			cout<<"Yes"<<endl<<i;
			return 0;
		}
	}
	cout<<"No"<<endl<<f[t];
	
	return 0;
}

贪心

贪心写法,烂尾了。。。

#include<bits/stdc++.h>
using namespace std;
int m,s,t;
int main(){
	cin>>m>>s>>t;
	int now=0;
	for(int i=1;i<=t;i++){
		if(m>=10){
			if(now+(m/10)*60>=s){
				while(now<s){
					now+=60;
					m/=10;
					i++;
					if(i==t) break;
				}
				cout<<"Yes"<<endl;
				cout<<i-1;
				return 0;
			}
			now+=min(m/10,t-i+1)*60;
			i+=m/10-1;
			m-=m/10*10;
		}
		else{
			if( ceil((s-now*1.0)/17)<(10-m)/4||
				( (ceil((s-now*1.0)/17)>t-i) &&(10-m)/4+(ceil(s-now*1.0)/60>t-i) ) ){
				now+=17;
				if(now>=s){
					cout<<"Yes"<<endl;
					cout<<i;
					return 0;
				}
			}
			else  m+=4;
		}
		cout<<i<<" "<<now<<" "<<m<<endl;
	}
	cout<<"No"<<endl;
	cout<<now;
	return 0;
}

标签:10,int,魔法,j1,j2,100,now,DP
From: https://www.cnblogs.com/wh1sky/p/17986327

相关文章

  • 初中英语优秀范文100篇-068I've Learned a lot from Reading Books-我从阅读书籍中学
    PDF格式公众号回复关键字:SHCZFW068记忆树1Booksplayanimportantroleinourlives.翻译书籍在我们的生活中扮演着重要的角色简化记忆角色句子结构"Books"是主语,表示事物"play"是谓语动词,表示主语的行为"animportantrole"是宾语,表示主语的行为结果"inou......
  • 动态规划之背包DP
    2024-1-24首先是完全背包和0-1背包:同样是限制空间容量最大为m,然后有n类物品,两者的区别在于:①完全背包中每一类物品有ki个,而0-1背包中每类物品只有1个。②实现上完全背包是正序循环的,而0-1背包是逆序循环的,因为前者需要考虑装多个物品的情况(这个从转移方程可......
  • CF467C George and Job 题解 DP 前缀和
    DP前缀和题目链接题意:给你一个长度为\(n\)的序列,让你从这个序列中挑选出\(k\)个长度为\(m\)的区间,并且任意区间不相交。使得选出的数之和最大,求出这个数。解法:很经典的DP模型,我们定义\(f_{i,j}\)表示从前\(i\)个数选出了\(j\)个区间可以取得的最大值,那么答案为:\(f_{n,k}\)。......
  • 重写SpringCloudGateway路由查找算法,性能提升100倍!
    如果你也在做SpringCloudGateway网关开发,希望这篇文章能给你带来一些启发背景先说背景,某油项目,通过SpringCloudGateway配置了1.6万个路由规则,实际接口调用过程中,会偶现部分接口从发起请求到业务应用处理间隔了大概5秒的时间,经排查后发现是SpringCloudGateway底层在查找对应的R......
  • CF-431-D-二分+数位DP
    431-D题目大意请你找到一个数\(n\),满足区间\([n+1,2n]\)中恰有\(m\)个数的二进制表示中有\(k\)个\(1\)。Solution这种区间中计数类型的题目首先相当数位DP。但是这里缺乏上下界,难点就在于观察到\(n\)的单调性(\([n+1,2n]\)中有\(k\)个\(1\)的数是单调不减的),简要证明:对于......
  • 退役前要做的 100 件事
    给自己起个ID\(✓\)@Creeper_l@YellowRose爆零一场模拟赛\(✓\)2023/07/31AK一场模拟赛\(✓\)2023/8/12记下第一次提交的日期\(✓\)2020-12-0720:19:43向大佬请教问题\(✓\)@World_Ender对自己的板子越看越满意\(✓\)有源汇上下界最大流......
  • CDP技术系列(三):百万级QPS的人群命中服务接口性能优化指南
    一、背景介绍CDP系统提供了强大的标签和群体的构建能力,面对海量数据的标签和群体,我们采用了Bitmap+ClickHouse的存储与计算方案。详细内容可以参考之前文章。有了群体之后,它们被广泛的应用到支付,消金,财富,营销等各种核心业务的用户拉新,交易转化,促活等核心链路中。而人群应用方式......
  • CDP技术系列(三):百万级QPS的人群命中服务接口性能优化指南
    一、背景介绍CDP系统提供了强大的标签和群体的构建能力,面对海量数据的标签和群体,我们采用了Bitmap+ClickHouse的存储与计算方案。详细内容可以参考之前文章。有了群体之后,它们被广泛的应用到支付,消金,财富,营销等各种核心业务的用户拉新,交易转化,促活等核心链路中。而人群应用方式中,基......
  • CDP 技术系列(二):ClickHouse+Bitmap 实现海量数据标签及群体组合计算
    一、背景介绍上一篇文章介绍了CDP中,面对单个标签或群体数十亿的数据如何存储我们都知道数据仓库的概念,它的里边存储了我们所有的数据,其中就包含了标签或群体所依赖的数据,但是这些数据并不能直接拿来使用,想要变成业务需要的标签或群体数据,还需要进行加工。数据工程师将数仓里的......
  • VCL界面组件DevExpress VCL v23.2亮点 - 高DPI / SVG支持
    DevExpressVCL是Devexpress公司旗下最老牌的用户界面套包,所包含的控件有:数据录入、图表、数据分析、导航、布局等。该控件能帮助您创建优异的用户体验,提供高影响力的业务解决方案,并利用您现有的VCL技能为未来构建下一代应用程序。DevExpressVCLv23.2已于日前正式发布,新版本宣......