题目: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. Python爬虫入门教程 44-100 Charles的安装与使用-手机APP爬虫部分

    1. 第二款抓包工具Charles安装与使用 Charles和Fiddler一样,也是一款抓包工具,比Fiddler界面更加清晰,支持多平台 1.1 官方网址 https://www.charlesp ...

  2. Windows Server 2012 R2安装SqlServer 2016

    1.系统安装 微软操作系统 Windows Server 2012 R2 官方原版镜像 Windows Server 2012 R2 是由微软公司(Microsoft)设计开发的新一代的服务器专属操作 ...

  3. 对称密码——DES加密算法

    前言 本篇博文将介绍对称密码算法中的DES密码的算法原理与代码实现(Java) DES算法原理 DES加密算法是对称加密算法(加密和解密使用同一个密钥)中的一种,DES也是分组密码,以64位为分组对明 ...

  4. C#知识拾遗

    参数验证方式 1.    一般方法 1.1 手动验证 最为普遍常见,略. 1.2 使用扩展方法验证 在C#3.0 中,引入了扩展方法,可以以一种更优雅的方式来进行参数验证,如: //参数辅助类 pub ...

  5. 如何将workerman部署到windows服务器上面

    一直以来对php的即时通讯都很好奇,其实是不知道应该怎么来实现,后来了解到了swoole和workerman这两个神器,他们都可以实现即时通信的功能,其中swoole是C语言编写的php扩展,其配置起 ...

  6. Yii2设计模式——单例模式

    应用举例 在Yii.php中: require __DIR__ . '/BaseYii.php'; // Yii框架的帮助类,提供框架基本的功能 class Yii extends \yii\Base ...

  7. Dynamics 365-OnPremise V9 安装系统要求

    Dynamics 365 V9 OnPremise发布之后,博主率真地直接下载安装,首先就遇到了操作系统不支持的问题,但是通过CRM安装报错提示,发现给的链接参考信息也不对. document的链接调 ...

  8. MySQL Error Number 1005 Can’t create table(Errno:150)

    mysql数据库1005错误解决方法 MySQL Error Number 1005 Can’t create table ‘.\mydb\#sql-328_45.frm’ (errno: 150) ...

  9. sqlserver数据库NULL类型注意事项

    1,变量NULL类型赋值需要初始化 2,判断条件

  10. C# Socket网络编程

    晚上利用空闲时间,用Socket做了一些小功能. 功能如下: a.聊天 b.传文件 c.抖动好友 主界面: 服务器 客户端 操作步骤: 服务器(测试环境的IP地址为:192.168.92.111,视情 ...