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 ...
随机推荐
- Vue基于vue-quill-editor富文本编辑器使用心得
vue-quill-editor的guthub地址,现在市面上有很多的富文本编辑器,我个人还是非常推荐Vue自己家的vue-quill-deitor,虽然说只支持IE10+,但这种问题,帅给别人吧! ...
- 《HelloGitHub》第 29 期
公告 月刊现已支持 RSS 订阅 <HelloGitHub>第 29 期 兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. ...
- springcloud~服务注册与发现Eureka的使用
服务注册与发现是微服务里的概念,也是一个基本的组件,负责服务组件的认证,即实现『你是谁』的功能,在服务注册与发现里,存在两种模式,即服务端发现和客户端发现,咱们今天说的eureka属于客户端发现! 下 ...
- IntelliJ IDEA~gradle环境配置
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具.它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置. Int ...
- Celery异步调度框架(一)基本使用
介绍 之前部门开发一个项目我们需要实现一个定时任务用于收集每天DUBBO接口.域名以及TOMCAT(核心应用)的访问量,这个后面的逻辑就是使用定时任务去ES接口抓取数据存储在数据库中然后前台进行展示. ...
- c# 获取当前时间的微秒
获取毫秒大家都经常用到. 大家应该都知道怎么用. 但是,毫秒下面还有微秒. 其实这个方法也已经在c#中. 只不过很少有人用到,所以查找资料也很少有人说. 下面代码就是获取微秒的方式: DateTime ...
- HttpClient在.NET Core中的正确打开方式
问题来源 长期以来,.NET开发者都通过下面的方式发送http请求: using (var httpClient = new HttpClient()) { var response = await ...
- 微信公众号开发C#系列-8、自定义菜单及菜单响应事件的处理
1.概述 自定义菜单能够帮助公众号丰富界面,让用户更好更快地理解公众号的功能.菜单分为默认菜单与个性化菜单.个性化菜单接口是为了帮助公众号实现灵活的业务运营,开发者可以通过该接口,让公众号的不同用户群 ...
- Django学习之八:forms组件【对form舒心了】
目录 Django forms组件 bound and unbound form instance forms渲染有关 隐藏一个字段,不渲染它 form 校验 form类 ModelForm 利用Mo ...
- 16进制字符串转QByteArray,char转16进制字符串
直接上代码,看代码你们就懂了 1.16进制QString转QByteArray QString str = "01 a5 1e 02"; QByteArray tmpBy; Str ...