题目: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的更多相关文章

  1. 一起学微软Power BI系列-使用技巧(5)自定义PowerBI时间日期表

    1.日期函数表作用 经常使用Excel或者PowerBI,Power Pivot做报表,时间日期是一个重要的纬度,加上做一些钻取,时间日期函数表不可避免.所以今天就给大家分享一个自定义的做日期表的方法 ...

  2. 一起学微软Power BI系列-使用技巧(4)Power BI中国版企业环境搭建和帐号问题

    千呼万唤的Power BI中国版终于落地了,相信12月初的微软技术大会之后已经铺天盖地的新闻出现了,不错,Power BI中国版真的来了,但还有些遗憾,国际版的一些重量级服务如power bi emb ...

  3. 一起学微软Power BI系列-使用技巧(3)Power BI安卓手机版安装与体验

    Power BI有手机版,目前支持安卓,苹果和WP,不过没有WP手机,苹果在国内还不能用,要FQ和用就不测试了.安卓的我也也是费了九牛二虎之力才把app下载下来,把方法分享给大家. FQ太麻烦,所以建 ...

  4. Power BI官方视频(3) Power BI Desktop 8月份更新功能概述

    Power BI Desktop 8月24日发布了更新版本.现将更新内容翻译整理如下,可以根据后面提供的链接下载最新版本使用. 1.主要功能更新 1.1 数据钻取支持在线版 以前的desktop中进行 ...

  5. 一起学微软Power BI系列-使用技巧(1)连接Oracle与Mysql数据库

    说起Oracle数据库,以前没用过Oracle不知道,但是这1年用Oracle后,发现真的是想狂吐槽,特别是那个.NET驱动和链接字符串,特别奇葩.总归是和其他数据库不一样,标新立异,不知道为何.另外 ...

  6. 千呼万唤始出来,微软Power BI简体中文版官网终于上线了,中文文档也全了。。

    前几个月时间,研究微软Power BI技术,由于没有任何文档和资料,只能在英文官网瞎折腾,同时也发布了英文文档的相关文章:系列文章,刚好上周把文章发布完,结果简体中文版上线了.哈哈,心里有苦啊,早知道 ...

  7. 微软新神器-Power BI横空出世,一个简单易用,还用得起的BI产品,你还在等什么???

    在当前互联网,由于大数据研究热潮,以及数据挖掘,机器学习等技术的改进,各种数据可视化图表层出不穷,如何让大数据生动呈现,也成了一个具有挑战性的可能,随之也出现了大量的商业化软件.今天就给大家介绍一款逆 ...

  8. 免费的精品: Productivity Power Tools 动画演示

    Productivity Power Tools 是微软官方推出的 Visual Studio 扩展,被用以提高开发人员生产率.它的出现一定程度上弥补和完善了 Visual Studio 自身的不足, ...

  9. 微软Power BI技术文章与资源目录

    下面是本博客原创的微软Power BI技术相关文章,对于部分转载文章和资源,会注明出处. 本博客将发布基于微软Power BI相关的基础入门文章,视频教程等资源,敬请关注. 个人建立的Power BI ...

随机推荐

  1. SnackbarUtilDemo【Snackbar的封装类】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这个工具类参考的是<没时间解释了,快使用Snackbar!——Android Snackbar花式使用指南>,代码几乎一 ...

  2. Asp.Net Core 轻松学-利用 Swagger 自动生成接口文档

    前言     目前市场上主流的开发模式,几乎清一色的前后端分离方式,作为服务端开发人员,我们有义务提供给各个客户端良好的开发文档,以方便对接,减少沟通时间,提高开发效率:对于开发人员来说,编写接口文档 ...

  3. 补习系列(14)-springboot redis 整合-数据读写

    目录 一.简介 二.SpringBoot Redis 读写 A. 引入 spring-data-redis B. 序列化 C. 读写样例 三.方法级缓存 四.连接池 小结 一.简介 在 补习系列(A3 ...

  4. Java基础系列-equals方法和hashCode方法

    原创文章,转载请标注出处:<Java基础系列-equals方法和hashCode方法> 概述         equals方法和hashCode方法都是有Object类定义的. publi ...

  5. Java使用Aspose组件进行多文档间的转换操作

    首先,祝大家新年快乐,2019诸事顺利,很久没有更新博客,今天要给大家说的是 ”Aspose“ 组件,作为2019年第一篇博客,希望大家能够多多支持,2019年要继续加油. 什么是Aspose? As ...

  6. 能够玩转BKY皮肤的 geek,有一半最后都成为了前端大师

    By Conmajia March 9, 2018 剩下的那一半全部扑街了. 世纪之初,BKY那些花里胡哨的预设皮肤曾经让初识网络的懵懂学子雀跃不已. 然而以现在的审美眼光看来,这些带着一股子扑面而来 ...

  7. 对于jQuery的了解

    1.了解jQuery与JavaScript的区别 css --外貌特征Html --躯干,骨架js --运动神经 jQuery就是对JavaScript的一个拓展,封装,就是让JavaScript更好 ...

  8. 基于Odoo框架的开源在线客服系统

    cs_base 开源客服系统,基于 Odoo 的客服模块 cs_base 是在强大的 Odoo 框架的基础上实现的一个在线客服应用 基础模块包含完整的 Web 在线客服的接入,坐席管理等,通过扩展可方 ...

  9. 基于html5 plus + Mui 移动App开发(一)

    使用Html5 plus + Mui 进行移动App开发,有一段时间了,这几日得空,做个资讯App分享给大家. 今天主要分享主页实现,首先看下效果: 此界面主要分为:标题.内容分类列表.搜索及设置按钮 ...

  10. 大华门禁SDK二次开发(二)-SignalR应用

    经过与大华技术支持的沟通,门禁服务程序已经开发好了,可以正常接收门禁开关事件,可以发送开门命令.基于项目实时性要求,这里使用SignalR实现门禁状态.控制命令的实时传送. 几种场景需求 根据Sign ...