当前位置: 首页 > news >正文

【补题】Educational Codeforces Round 150 (Rated for Div. 2) C. Ranom Numbers

题意:给一串字符串,从A-E,数值大小分别为1,10,100,1000,10000,对于这个字符串数值总和的计算方式是,如果那一位的字符的右侧有严格大于它的字符,那么数值变为负数,有一次随意改写一个位置字符的操作,问最大的数值是多少。

dp思路:

1.首先由于题目的性质,改变一个位置的字符,不会对它的右侧造成影响,所以在已知右侧字符的情况下,左侧其实要关注的是已知字符子串的最大,因为大于最大不会受影响,小于怎么样都受影响,只需要关注已知出现的最大字符,这给了dp的机会,所以首先反转字符串

2.反转字符串在于,现在问题就转化成了,已知左边字符串的情况,问右边在后续的最大数值,因为前面不会受后面影响,所以这就能dp了。

那么已知左侧,其实只要关注最大,上面解释过了,dp数组此时很明显dp[i][j][k],代表当进行到第i位,出现过的最大字符(j),然后操作过k次(k被限定为0/1)即可,然后就是正常dp。

代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
const int N = 3e5+10;
const int INF = 1e18;
const int MOD = 1e9+7;

int cnum[5]={1,10,100,1000,10000};
int dp[N][5][2];

void solve(){
	string s;
	cin >> s;
	s=" "+s;
	reverse(s.begin()+1,s.end());
	int n=s.size();
	
	for(int i=0;i<=n;i++){
		for(int j=0;j<5;j++){
			for(int k=0;k<2;k++){
				dp[i][j][k]=-INF;
			}
		}
	}
	
	dp[0][0][0]=0;
	
	
	
	for(int i=1;i<n;i++){
		for(int j=0;j<5;j++){
			for(int k=0;k<2;k++){
				
				if(j>(s[i]-'A')){
					dp[i][j][k]=max(dp[i][j][k],dp[i-1][j][k]-cnum[s[i]-'A']);
				}
				else{
					dp[i][s[i]-'A'][k]=max(dp[i][s[i]-'A'][k],dp[i-1][j][k]+cnum[s[i]-'A']);
				}
				
			}
			
			for(int k=0;k<5;k++){
				
				if(j>k){
					dp[i][j][1]=max(dp[i][j][1],dp[i-1][j][0]-cnum[k]);
				}
				else{
					dp[i][k][1]=max(dp[i][k][1],dp[i-1][j][0]+cnum[k]);
				}
				
			}
			
		}
	}
	
	int res=-INF;
	for(int i=0;i<5;i++){
		res=max(res,dp[n-1][i][0]);
		res=max(res,dp[n-1][i][1]);
	}
	
	cout << res << endl;
	
	
	
}

signed main() {
	IOS;
	
	int t = 1;
	cin >> t;
	while (t--) {
		solve();
	}
	
}

非常简洁明了的代码,感觉比自己写的强了几百倍,自己写的时候不仅方向错误,而且后面看了思路,实现的也不好。

http://www.dtcms.com/a/121737.html

相关文章:

  • 计算机中的单位
  • 基于php扩展加密的一个简单逆向
  • 深入 C++ 线程库:从创建到同步的探索之旅
  • 天基光学图像仿真原理简介
  • 一个很好用的vue2在线签名组件
  • 《系统分析师-基础篇-7-9章总结》
  • 嵌入式AI前沿:精选工具与应用网站解析
  • 25/4/9 算法笔记 DBGAN+强化学习+迁移学习实现青光眼图像去模糊1
  • CSS Grid布局:从入门到放弃再到真香
  • CF442A Borya and Hanabi
  • latex模板文件
  • VTK随笔十四:QT与VTK的交互示例(平移)
  • Docker多阶段构建深度优化指南:从GB到MB的镜像瘦身革命
  • 【C语言】浮点数在内存的储存
  • Element Plus 组件库二次封装在ZKmall商城的实践与沉淀
  • 2.4GHz射频前端噪声系数优化架构
  • 内存分配中的堆(Memory Heap)详解
  • C++类成员内存分布详解
  • Android 11 (API 30) 及更高版本中,查询的特定应用商店包,无需动态请求权限处理
  • MyBatis 详解及代码示例
  • 机器学习--数据填充
  • 楼宇自控系统构建机电设备管理新方式,提升建筑管理水平
  • 【C++进阶】关联容器:set类型
  • Python 3.x cxfreeze打包exe教程
  • LeetCode 解题思路 35(Hot 100)
  • 如何理解KMP算法中的next数组
  • 气象水文耦合模式 WRF-Hydro 建模技术与案例实践应用
  • [leetcode]差分算法
  • FPGA_DDR错误总结
  • Spring Boot 应用中如何避免常见的 SQL 性能问题