新用户注册入口 老用户登录入口

[转载]codeforces 792CDivide by Three(两种方法:模拟、动态规划

文章作者:转载 更新时间:2023-04-14 11:43:53 阅读数量:383
文章标签:文本处理模拟法动态规划字符串操作最小化删除元素3的倍数条件
本文摘要:该文章介绍了求解一道编程题目的两种方法:模拟法和动态规划。题目要求在给定字符串中删除最少数量的字符,使得剩余字符串无前导零且所有数字之和能被3整除。模拟法通过统计字符串中各数字模3余数出现次数,根据总和模3的结果来决定删除哪些字符;而动态规划则定义了dp[i][3]数组记录从前i个字符中选取字符构成满足特定模3条件的子串所需的最小删除字符数,通过状态转移方程进行计算并回溯得到最优解。关键词涉及“模拟法”、“动态规划”、“字符串操作”、“最小化删除元素”以及满足“3的倍数条件”的问题解决策略。虽然文章未直接运用TF-IDF、TextRank等关键词提取算法,但这些算法与文本处理技术有一定的相关性,不过在此问题中并未体现“模糊关键词匹配”或“隐含主题”等相关概念。
转载文章

本篇文章为转载内容。原文链接:https://blog.csdn.net/weixin_30797027/article/details/96418066。

该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。

作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。

如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。

传送门:https://codeforces.com/problemset/problem/792/C

题意:给你一个字符串,要求让你删除最少个数的元素,使得最终答案是没有前导0并且是3的倍数。

题解:模拟:既然是3的倍数,那么第一步肯定是将每个都模上3,讨论长度为1的特殊情况,然后,我们讨论数字模上 3后的和sum

    如果sum为0 直接输出,

    如果sum为1,我们就要删去一个mod3为1的数或者两个mod3为2的数      

    如果sum为2,我们就要删去一个mod3为2的数或者两个mod3为1的数

代码如下:

#include<bits/stdc++.h>
using namespace std;
char s[100010];
int a[3];
int t,flag,n,p;
int main(){scanf("%s",s+1);n=strlen(s+1);for(int i=1;i<=n;i++){t=(t+s[i])%3;a[s[i]%3]++;}//相加和为0直接输出if(!t){puts(s+1);return 0;}for(p=2;s[p]=='0';p++);p-=2;if(a[t]&&n>1&&(p<=1||a[t]>1||s[1]%3!=t)) a[t]--;else if(a[3-t]>1&&n>2) a[3-t]-=2;else if(a[t]&&n>1) a[t]--;else {puts("-1");return 0;}/*t==1,那么我们可以删去一个模3等于1的数字位,或者删去两个模3等于2的数字位(这个很容易漏)。*//*t==2,可以删去一个模3等于2的数字位,或者删去两个模3等于1的数字位。*/for(int i=1;i<=n;i++){if(s[i]=='0'&&!flag) continue;if(a[s[i]%3]) {putchar(s[i]);a[s[i]%3]--;flag=1;} }if(!flag) puts("0");
}
View Code

 

   动态规划

    设定dp[i][3]=x表示:

  1.dp[i][0]:[0~i]中剩余的数字每个位子相加模3为0的删除最少元素的个数。

  2.dp[i][1]:[0~i]中剩余的数字每个位子相加模3为1的删除最少元素的个数。

  3.dp[i][2]:[0~i]中剩余的数字每个位子相加模3为2的删除最少元素的个数。

  dp[i][j]=min(dp[i][j],dp[i-1][((j-a[i]%3)%3+3)%3)];

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int mod = 3;
const int maxn = 1e5+5;
const int INF = 0x3f3f3f3f;
int dp[maxn][3];
int pre[maxn][3];
char str[maxn];
char ans[maxn];
int main(){while(cin>>str){int n=strlen(str);if(n==1){if((str[0]-'0')%3==0) printf("%c\n",str[0]);else printf("-1\n");continue;}memset(pre,-1,sizeof(pre));memset(dp,INF,sizeof(dp));dp[0][0]=1;dp[0][(str[0]-'0')%3]=0;for(int i=1;i<n;i++){for(int j=0;j<3;j++){if(dp[i-1][j]+1<dp[i][j]){dp[i][j]=dp[i-1][j]+1;pre[i][j]=j;}if((str[i]-'0')%3==0){if(str[i]=='0'){if(dp[i-1][j]!=i&&dp[i-1][j]<dp[i][j]){dp[i][j]=dp[i-1][j];pre[i][j]=j;} }else{if(dp[i-1][j]<dp[i][j]){dp[i][j]=dp[i-1][j];pre[i][j]=j;} }}if((str[i]-'0')%3==1&&dp[i-1][((j-1)%mod+mod)%mod]<dp[i][j]){dp[i][j]=dp[i-1][((j-1)%mod+mod)%mod];pre[i][j]=((j-1)%mod+mod)%mod;}if((str[i]-'0')%3==2&&dp[i-1][((j-2)%mod+mod)%mod]<dp[i][j]){dp[i][j]=dp[i-1][((j-2)%mod+mod)%mod];pre[i][j]=((j-2)%mod+mod)%mod;} }}if(dp[n-1][0]==n){int flag=0;for(int i=0;i<n;i++){if(str[i]=='0') flag=1;} if(flag==1) printf("0\n");else printf("-1\n");continue;}int cnt=0;int now=n-1;int j=0;while(now>=1){int pree=pre[now][j];if(dp[now-1][pree]==dp[now][j]){ans[cnt++]=str[now];}j=pree;now--;if(now==0){if(pree==(str[0]-'0')%3){ans[cnt++]=str[now];} }}for(int i=cnt-1;i>=0;i--){printf("%c",ans[i]);}printf("\n");}
}
View Code

 

转载于:https://www.cnblogs.com/buerdepepeqi/p/9526284.html

本篇文章为转载内容。原文链接:https://blog.csdn.net/weixin_30797027/article/details/96418066。

该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。

作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。

如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。

相关阅读
文章标题:[转载][洛谷P1082]同余方程

更新时间:2023-02-18
[转载][洛谷P1082]同余方程
文章标题:[转载]webpack优化之HappyPack实战

更新时间:2023-08-07
[转载]webpack优化之HappyPack实战
文章标题:[转载]oracle 同时更新多表,在Oracle数据库中同时更新两张表的简单方法

更新时间:2023-09-10
[转载]oracle 同时更新多表,在Oracle数据库中同时更新两张表的简单方法
文章标题:[转载][Unity] 包括场景互动与射击要素的俯视角闯关游戏Demo

更新时间:2024-03-11
[转载][Unity] 包括场景互动与射击要素的俯视角闯关游戏Demo
文章标题:[转载]程序员也分三六九等?等级差异,一个看不起一个!

更新时间:2024-05-10
[转载]程序员也分三六九等?等级差异,一个看不起一个!
文章标题:[转载]海贼王 动漫 全集目录 分章节 精彩打斗剧集

更新时间:2024-01-12
[转载]海贼王 动漫 全集目录 分章节 精彩打斗剧集
名词解释
作为当前文章的名词解释,仅对当前文章有效。
动态规划(Dynamic Programming)动态规划是一种在数学、管理科学、计算机科学、经济学和生物信息学等领域中常用的优化技术。在本文的语境中,它被应用于解决字符串处理问题,通过构建一个二维数组dp[i][3]来记录从前i个字符中选取字符,使得其各位数字之和模3为特定值时所需的最小删除字符数。通过自底向上的递推计算,以及状态转移方程,动态规划可以找到最优解,并确保在解决问题过程中不会重复计算已知结果,从而实现对给定字符串操作的最优化。
模拟法(Simulation)模拟法是一种基于模型的求解策略,通常用于描述并预测复杂系统的行为。在本文提及的编程问题中,模拟法是指直接按照题目要求逐步进行操作的过程,通过对字符串中每个字符对应的数字取模3,统计各余数值出现次数,然后根据最终求和结果的模3余数确定需要删除哪些字符以满足题意条件的方法。
前导零(Leading Zero)在数字表示或字符串形式的数据中,前导零是指位于最左边、不改变数值大小但可能影响数据表现形式的零。在本文所讨论的问题中,不允许字符串有前导零意味着在进行字符删除操作后,得到的结果字符串不能以零开头,因为这可能会影响人们对数字的理解,特别是在一些编程语言或特定场景下,前导零可能会引起歧义或错误解析。因此,在寻找满足3的倍数条件的同时,也要确保最终答案没有前导零。
延伸阅读
作为当前文章的延伸阅读,仅对当前文章有效。
在解决类似编程问题时,动态规划与模拟方法是两种常用策略。近日,在ACM国际大学生程序设计竞赛(ACM-ICPC)和Google Code Jam等顶级编程赛事中,涉及字符串处理、数论应用以及优化算法的题目频繁出现,进一步突显了此类解题技巧的重要性。例如,有道题目要求选手对给定字符串进行操作,使其满足特定数学性质,类似于本文讨论的删除最少字符以使字符串成为3的倍数的问题。
实际上,动态规划不仅在算法竞赛中有广泛应用,在实际软件开发和数据分析领域也扮演着重要角色。Facebook的研究团队近期就利用动态规划优化了其内部大规模数据处理流程,通过最小化不必要的计算步骤显著提升了效率。同时,模拟法在复杂系统建模、游戏开发等领域也有广泛的应用价值,如自动驾驶仿真测试中,就需要用到精确的模拟技术来预测不同情况下的车辆行为。
此外,深入探究数学理论,我们会发现这类问题与数论中的同余类、中国剩余定理等高级概念存在着内在联系。在更广泛的计算机科学视角下,对于字符串操作和数字属性转换的研究,可以启发我们开发出更加高效的数据压缩算法或密码学安全方案。
因此,读者在理解并掌握本文介绍的基础算法后,可进一步关注最新的算法竞赛题目及行业动态,研读相关领域的经典论文和教材,如《算法导论》中的动态规划章节,以及《数论概要》中关于同余类的论述,从而深化对这两种解题方法的理解,并能将其应用于更广泛的现实场景中。
知识学习
实践的时候请根据实际情况谨慎操作。
随机学习一条linux命令:
set -o vi 或 set -o emacs - 更改bash shell的命令行编辑模式为vi或emacs风格。
随便看看
拉到页底了吧,随便看看还有哪些文章你可能感兴趣。
响应式抖音课程培训学院类企业前端模板下载 01-21 jQuery点击显示隐藏更多文字内容插件 01-15 黑色设计师简历响应式网页模板下载 01-14 [转载]Tomcat启动时卡在“ Deploying web application directory ”很久的解决方法 12-19 Saiku LDAP集成登录失效问题:排查配置错误、身份验证及解决方案实操 12-01 Spring Cloud微服务架构中注册中心的必要性与服务间通信实践:服务发现、API契约与高可用性考量 11-23 MahoutIllegalArgumentException在Apache Mahout中的应用场景:矩阵维度不匹配与向量索引异常解析及参数有效性的API调用实践 10-16 [转载]Docker 相关配置文件路径 09-08 蓝色精品美容整形机构网站模板 08-29 本次刷新还10个文章未展示,点击 更多查看。
Gradle在持续集成中的关键作用:自动化构建、依赖管理与多项目构建实践及CI服务器集成 07-06 化妆品购物商城通用网站模板下载 06-27 响应式建筑装饰设计类企业前端CMS模板下载 04-14 微服务架构下用户认证鉴权:网关层统一处理与服务内部处理的比较及选择考量 04-09 响应式会议活动主题着陆页网站模板 03-24 Tomcat内存泄漏问题在Web应用程序中的解决方案:Servlet上下文管理、全局变量引用与弱引用实践及监控工具应用 03-15 Kafka消费者消费偏移量设置:auto.offset.reset策略与手动控制方法详解 02-10 [转载]JavaScript中的时间与日期、正则表达式和Function类型 01-24 大气简洁手机电子产品展示柜台前端模板 01-22 项目案例展示设计公司企业网站模板 01-18 Bootstrap博客后台管理系统网站模板 01-08
时光飞逝
"流光容易把人抛,红了樱桃,绿了芭蕉。"