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 ...
随机推荐
- ConfirmCancelBottomSheetDialog【确认取消底部对话框】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 继承BottomSheetDialog,实现简单的确认取消对话框样式. 效果图 代码分析 ConfirmCancelBottomSh ...
- 流水车间调度算法分析的简单+Leapms实践--混合整数规划的启发式建模
流水车间调度算法分析的简单+Leapms实践--混合整数规划的启发式建模 清华大学出版社出版的白丹宇教授著作<流水车间与开放车间调度算法渐近分析>采用渐近分析方法分析多个NP-难类启发调度 ...
- SQL 注入~MySQL专题
Recently, 团队在做一个关于SQL的项目,这个专题是项目中的一部分,该部分正是由我来负责的.今天,分享给正在奋斗中的伙伴们,愿,你们在以后的学习道路中能有自己的收获. ...
- springcloud情操陶冶-springcloud config server(一)
承接前文springcloud情操陶冶-springcloud context(二),本文将在前文基础上浅析下ConfigServer的工作原理 前话 根据前文得知,bootstrapContext引 ...
- JavaScript小记二则:接上一节:用.net写Textbox控件关于数字的判断的另一则方法
方法二.通过写JS进行判断控制输入的只能为数字,源码如下: <!DOCTYPE html> <html> <body> <h1></h1> ...
- Docker 容器镜像删除
1.停止所有的container,这样才能够删除其中的images: docker stop $(docker ps -a -q) 如果想要删除所有container的话再加一个指令: docker ...
- Unable to execute 'doFinal' with cipher instance [javax.crypto.Cipher@4e025e0a]
org.apache.shiro.crypto.CryptoException: Unable to execute 'doFinal' with cipher instance [javax.cry ...
- 2018/1.6 Javascript 继承和克隆
这种写法不是对象克隆,就是把obj的内存地址赋给obj2 通过 for in 克隆 不管公有还是私有的都克隆成私有的. js提供了一个克隆方法 objct.create() var obj2=obje ...
- SAP HUM 事务代码HUMO为整托做Scrap
SAP HUM 事务代码HUMO为整托做Scrap HUMO事务代码查询结果里,选择某个HU, 回车,过账成功, 2019-04-10 写于苏州市.
- arcgis api 3.x for js 入门开发系列十七在线天地图、百度地图、高德地图(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...