dp专题(三)

ABC317:D.President

问题陈述

高桥和青木正在竞选。

共有 NN 个选区。其中 ii 个选区有 Xi+YiXi​+Yi​ 个选民,其中 XiXi​ 个是高桥的选民, YiYi​ 个是青木的选民。 Xi+YiXi​+Yi​ 总是奇数)。 在每个选区,多数党赢得该选区的所有 ZiZi​ 个席位。然后,谁赢得了整个 NN 选区的多数席位,谁就赢得了选举。 ∑i=1NZii=1∑N​Zi​ 是奇数)。 至少要有多少选民从青木转向高桥,高桥才能赢得选举?

限制因素
  • 1≤N≤1001≤N≤100
  • 0≤Xi,Yi≤1090≤Xi,Yi≤109
  • Xi+YiXi+Yi 是奇数。
  • 1≤Zi1≤Zi
  • ∑i=1NZi≤105i=1∑NZi≤105
  • ∑i=1NZii=1∑NZi 奇数。
做法

dpij 下标:考虑了前i 个地区,席位是j ;值:最少转移人数

复制代码
#include<bits/stdc++.h>
using namespace std;

long long dp[110][100010];
int n;
int suma,sum;//本来就有的席位 和 总席位

struct ty{
	long long x,y;
	int z;
	long long num;
};
vector<ty> v;//存不属于a的地区

int main(){

	memset(dp,0x3f3f3f3f3f3f3f3f,sizeof(dp));
	cin>>n;

	for(int i=1;i<=n;i++){

		long long x,y;
		int z;
		scanf("%lld%lld%d",&x,&y,&z);

		sum+=z;

		if(x>y) suma+=z;

		else{
			v.push_back({x,y,z,(x+y+1)/2-x});
		}

	}
	
	if(suma>sum-suma){
		cout<<0;
		return 0;
	}
	
	dp[0][0]=0;
	for(int i=1;i<=v.size();i++){

		for(int j=0;j<=sum-suma;j++){

			dp[i][j]=dp[i-1][j];//不选当前地区

			if(j>=v[i-1].z) dp[i][j]=min(dp[i][j],dp[i-1][j-v[i-1].z]+v[i-1].num);//选当前地区

		}
	}
	
	long long ans=0x3f3f3f3f3f3f3f3f;
	for(int j=(sum+1)/2-suma;j<=sum-suma;j++){//a获胜至少需要(sum+1)/2个席位(包括原本就支持a的)
		ans=min(dp[v.size()][j],ans);
	}

	cout<<ans;
	
}

ABC365:D - AtCoder Janken 3

问题陈述

高桥和青木玩了 NN 次石头剪刀布。[注:在这个游戏中,石头赢剪刀,剪刀赢纸,纸赢石头。

青木的动作由长度为 NN 的字符串 SS 表示,字符串由 "R"、"P "和 "S "组成。{8343042}中的 ii -th字符表示青木在 ii -th对局中的棋步:R "表示 "石头","P "表示 "纸","S "表示 "剪刀"。

高桥的棋步满足以下条件:

  • 高桥从未输给过青木。
  • 对于 i=1,2,...,N−1i=1,2,...,N−1 ,高桥在 ii /th对局中的棋步与他在 (i+1)(i+1) /th对局中的棋步不同。

请计算高桥的最大胜局数。

可以保证存在一个满足这些条件的高桥下棋顺序。

限制因素
  • 1≤N≤2×1051≤N≤2×105
  • SS 是长度为 NN 的字符串,由 RPS 组成。
  • NN 是一个整数。
做法

dp数组 下标:前i局,当前局出的是石头或剪刀或布 ;值:前 i 局的获胜数

复制代码
#include<bits/stdc++.h>
using namespace std;
int n;
string s;
int dp[200010][3];//下标:前i局,当前局出的是石头或剪刀或布  值:前i局的获胜数 
int main() {
	scanf("%d",&n);
	cin>>s;
	s=" "+s;
	for(int i=1;i<=n;i++){
		if(s[i]=='R'){
			
			//出石头 的话,上局出的就是 布或剪刀 (因为不能重复出一样的),且给当局的贡献为0 (平局了) 
			dp[i][0]=max(dp[i-1][1],dp[i-1][2]);
			
			//出 布 的话,上局出的就是 石头或剪刀 (因为不能重复出一样的),且给当局的贡献为1 (赢了) 
			dp[i][2]=max(dp[i-1][0],dp[i-1][1])+1;
			
		}
		
		if(s[i]=='S') {
			dp[i][1]=max(dp[i-1][0],dp[i-1][2]);
			dp[i][0]=max(dp[i-1][1],dp[i-1][2])+1;
		}
		
		if(s[i]=='P'){
			dp[i][2]=max(dp[i-1][0],dp[i-1][1]);
			dp[i][1]=max(dp[i-1][0],dp[i-1][2])+1;
		}
	}
	
	//看最后一局出啥的获胜数最大 
	cout<<max(dp[n][0],max(dp[n][1],dp[n][2])); 
}
相关推荐
AIGCmagic社区几秒前
灵巧手VLA真机均分71%,北大DeCAL用接触门控接入触觉
人工智能·算法·aigc·ai多模态
迷途之人不知返11 分钟前
算法系列4:前缀和
算法
吠品17 分钟前
Python 写入 Excel 的两种主流方案实际用法总结
c语言·开发语言·算法
Zane199422 分钟前
归并排序和堆排序都能保证O(nlogn),为什么谁也没法把稳定和原地两个优点占全
算法·排序算法
天天喝旺仔26 分钟前
Go 泛型实战:从类型参数、约束到可复用泛型容器与函数
数据结构·算法·容器·go
可爱的小小小狼30 分钟前
【无标题】
java·算法
和裕2 小时前
平口开槽箱 vs 飞机盒 vs 扣底盒:自动化、展示效果与成本核心区别
大数据·运维·网络·人工智能·算法·自动化
AgentMaster2 小时前
从售前到售后全链路覆盖:智能客服在企业 5 大场景的落地实践与工具选型
大数据·人工智能·算法
Cccp.1232 小时前
【leetcode】(六) 图和贪心算法
数据结构·算法·leetcode
y1su2 小时前
【Leetcode】1477. 找两个和为目标值且不重叠的子数组
数据结构·后端·算法·leetcode·职场和发展