Acdream1201 SuSu's Power
题目:SuSu's Power
链接:http://acdream.info/problem?pid=1201
题意:一个人站在x轴原点上,初始方向向x轴正方向,由一个字符串来控制其运动,字符串由A、B组成,A表示前进一步,B表示反向,给出字符串,问修改m次字符的情况下,人离原点最远多少?(可以重复修改一个字符,可令 A变B 或 B变A)
思路:
最近区间DP做多了,试了好久的区间DP。。。后来发现根本不需要用它(用了时间复杂度太高了。),因为必须把字符串完整用完,所以从第一个字符开始递推就可以了。后来改了方法,又因为不知道m次可以针对同一个字符,错了好多次(思路也基本固定了,后来按原来思路稍加修改居然闯下来了)。。。
首先,我假定m次必须用完(。。。强装我是故意的),用dp[105][55][2][2]计算,第一维表示下标,第二维表示修改次数,第三维表示方向(向右/向左),第四维表示最大或最小,dp[i][j][0][0]就表示解决前i 个字符,修改j次,当前方向是0的最大值(不是距离)。
现在递推式就很简单了,按正常逻辑写就可以了,最终M次的答案就是dp[n-1][m][0][0], 01, 10, 11四个的绝对值求最大,必须都考虑,不能认为方向0的最大值一定是正数,举个例子BAB 0。
最后解决m次可以改变同一字符的情况,假如我改了第一个字符两次,就相当于m=m-2,所以取他们的较大值即可。
AC代码:
#include<stdio.h>
#include<algorithm>
using namespace std;
#define N 105
#define M 55
#define INF 1e9
/*
dp[i][j][k][x]:
i前,修改j次,当前是加/减,最大值/最小值
*/
int dp[N][M][][];
void initdp()
{
for(int i=; i<N; i++){
for(int j=; j<M; j++){
for(int k=; k<; k++){
for(int u=; u<; u++){
dp[i][j][k][u]=-INF;
}
}
}
}
}
int add(int x, int y){
if(x==-INF) return -INF;
return x+y;
}
int min(int x, int y)
{
if(x==-INF && y==-INF) return -INF;
else if(x==-INF) return y;
else if(y==-INF) return x;
else return x<y?x:y;
}
int main()
{
int n, m, cas=;
char s[N];
while(~scanf("%d", &n)){
scanf("%s%d", s, &m);
initdp();
if(s[]=='A'){
dp[][][][]=;
dp[][][][]=;
dp[][][][]=;
dp[][][][]=;
}
else{
dp[][][][]=;
dp[][][][]=;
dp[][][][]=;
dp[][][][]=;
}
for(int i=; i<n; i++){
if(s[i]=='A'){
dp[i][][][]=add(dp[i-][][][],);
dp[i][][][]=add(dp[i-][][][],);
dp[i][][][]=add(dp[i-][][][],-);
dp[i][][][]=add(dp[i-][][][],-);
for(int k=; k<=m && k<=i+; k++){
dp[i][k][][]=max(add(dp[i-][k][][], ), dp[i-][k-][][]);
dp[i][k][][]=min(add(dp[i-][k][][], ), dp[i-][k-][][]);
dp[i][k][][]=max(add(dp[i-][k][][], -), dp[i-][k-][][]);
dp[i][k][][]=min(add(dp[i-][k][][], -), dp[i-][k-][][]);
}
}
else
{
dp[i][][][]=dp[i-][][][];
dp[i][][][]=dp[i-][][][];
dp[i][][][]=dp[i-][][][];
dp[i][][][]=dp[i-][][][];
for(int k=; k<=m && k<=i+; k++){
dp[i][k][][]=max(add(dp[i-][k-][][], ), dp[i-][k][][]);
dp[i][k][][]=min(add(dp[i-][k-][][], ), dp[i-][k][][]);
dp[i][k][][]=max(add(dp[i-][k-][][], -), dp[i-][k][][]);
dp[i][k][][]=min(add(dp[i-][k-][][], -), dp[i-][k][][]);
}
}
} //int x, y, z, k;
//while(~scanf("%d%d%d%d", &x, &y, &z, &k)){
// printf("==> %d\n", dp[x][y][z][k]);
//} int ans=-INF;
while(m>=)
{
int tmp=-INF;
if(dp[n-][m][][]!=-INF && dp[n-][m][][]!=-INF)
tmp=max(abs(dp[n-][m][][]), abs(dp[n-][m][][]));
else if(dp[n-][m][][]!=-INF) tmp=abs(dp[n-][m][][]);
else if(dp[n-][m][][]!=-INF) tmp=abs(dp[n-][m][][]); if(dp[n-][m][][]!=-INF && dp[n-][m][][]!=-INF) tmp = max(tmp, max(abs(dp[n-][m][][]), abs(dp[n-][m][][])));
else if(dp[n-][m][][]!=-INF) tmp=max(tmp, abs(dp[n-][m][][]));
else if(dp[n-][m][][]!=-INF) tmp=max(tmp, abs(dp[n-][m][][])); ans=max(ans, tmp);
m-=;
} printf("Case #%d: %d\n", cas++, ans);
}
return ;
}
Acdream1201 SuSu's Power的更多相关文章
- 一起学微软Power BI系列-使用技巧(5)自定义PowerBI时间日期表
1.日期函数表作用 经常使用Excel或者PowerBI,Power Pivot做报表,时间日期是一个重要的纬度,加上做一些钻取,时间日期函数表不可避免.所以今天就给大家分享一个自定义的做日期表的方法 ...
- 一起学微软Power BI系列-使用技巧(4)Power BI中国版企业环境搭建和帐号问题
千呼万唤的Power BI中国版终于落地了,相信12月初的微软技术大会之后已经铺天盖地的新闻出现了,不错,Power BI中国版真的来了,但还有些遗憾,国际版的一些重量级服务如power bi emb ...
- 一起学微软Power BI系列-使用技巧(3)Power BI安卓手机版安装与体验
Power BI有手机版,目前支持安卓,苹果和WP,不过没有WP手机,苹果在国内还不能用,要FQ和用就不测试了.安卓的我也也是费了九牛二虎之力才把app下载下来,把方法分享给大家. FQ太麻烦,所以建 ...
- Power BI官方视频(3) Power BI Desktop 8月份更新功能概述
Power BI Desktop 8月24日发布了更新版本.现将更新内容翻译整理如下,可以根据后面提供的链接下载最新版本使用. 1.主要功能更新 1.1 数据钻取支持在线版 以前的desktop中进行 ...
- 一起学微软Power BI系列-使用技巧(1)连接Oracle与Mysql数据库
说起Oracle数据库,以前没用过Oracle不知道,但是这1年用Oracle后,发现真的是想狂吐槽,特别是那个.NET驱动和链接字符串,特别奇葩.总归是和其他数据库不一样,标新立异,不知道为何.另外 ...
- 千呼万唤始出来,微软Power BI简体中文版官网终于上线了,中文文档也全了。。
前几个月时间,研究微软Power BI技术,由于没有任何文档和资料,只能在英文官网瞎折腾,同时也发布了英文文档的相关文章:系列文章,刚好上周把文章发布完,结果简体中文版上线了.哈哈,心里有苦啊,早知道 ...
- 微软新神器-Power BI横空出世,一个简单易用,还用得起的BI产品,你还在等什么???
在当前互联网,由于大数据研究热潮,以及数据挖掘,机器学习等技术的改进,各种数据可视化图表层出不穷,如何让大数据生动呈现,也成了一个具有挑战性的可能,随之也出现了大量的商业化软件.今天就给大家介绍一款逆 ...
- 免费的精品: Productivity Power Tools 动画演示
Productivity Power Tools 是微软官方推出的 Visual Studio 扩展,被用以提高开发人员生产率.它的出现一定程度上弥补和完善了 Visual Studio 自身的不足, ...
- 微软Power BI技术文章与资源目录
下面是本博客原创的微软Power BI技术相关文章,对于部分转载文章和资源,会注明出处. 本博客将发布基于微软Power BI相关的基础入门文章,视频教程等资源,敬请关注. 个人建立的Power BI ...
随机推荐
- .NET Core微服务之基于Apollo实现统一配置中心
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.关于统一配置中心与Apollo 在微服务架构环境中,项目中配置文件比较繁杂,而且不同环境的不同配置修改相对频繁,每次发布都需要对应修改 ...
- ASP.NET Core开发者指南
ASP.NET Core开发者指南 2019年ASP.NET Core开发者指南: 你可以在下面找到一张图,该图展示了你可以选取的路径及你想学习的库,从而成为一名 ASP.NET Core 开发者.“ ...
- apriori && fpgrowth:频繁模式与关联规则挖掘
已迁移到我新博客,阅读体验更佳apriori && fpgrowth:频繁模式与关联规则挖掘 详细代码我放在github上:click me 一.实验说明 1.1 任务描述 1.2 数 ...
- 为什么要抛弃Pact?如何快速实现契约测试(CDC)
前言 在前几天的博客中,我转载了一篇文章,其中介绍了契约测试和pact是怎么实施的,的确很有帮助.但我经过研究,其实是pact本身也是有缺陷的,结合我近期在使用的服务型工具和我的实际情况,觉得实现契约 ...
- AspNetCoreapi 使用 Docker + Centos 7部署
好久没有更新文章了,前段时间写了一系列的文章放到桌面了,想着修修改改,后来系统中勒索病毒了还被公司网络安全的抓到是我电脑,后来装系统文章给装丢了.然后好长一段时间没有写了. 今天记录一下AspNetC ...
- App.config自定义节点读取
<?xml version="1.0" encoding="utf-8"?> <configuration> <!--<ot ...
- DevExpress AspxGridView分页使用隐藏系统默认英文分页
1第一篇文章研究了怎么汉化,但是在实际使用过程中发现汉化的有小问题,DevExpress支持自定义按钮,也可以在属性中设置成中文,这样避免汉化不准确的问题 <dx:ASPxGridView ID ...
- spring通知执行的顺序
点击下载本示例相关代码 关于spring aop的具体使用,暂时不在这里讲解,后面会特定来讲解,本次主要探讨spring中通知执行的顺序. spring中通知分为以下几种: before:前置通知,在 ...
- python函数练习题
- python的学习笔记01_6练习
# 一.[用户登陆程序]# 基础需求:# 让用户输入用户名密码# 认证成功后显示欢迎信息# 输错三次后退出程序 count = 0 name = "cheng" password ...