1479: Treasure Chest Lock

Time Limit: 1 Sec  Memory Limit: 128 MB

Submit: 7  Solved: 5

[

id=1479">Submit][

id=1479">Status][Web
Board
]

Description

Vic has a treasure chest. And there is a lock on the treasure chest. The lock contains a sequence of wheels. Each wheel has the 26 letters of the English alphabet

‘a’ through ‘z’, in order. If you move a wheel up, the letter it shows changes to the next letter in the English alphabet (if it was showing the last letter ‘z’, then it

changes to ‘a’). If you move the wheel down, it changes to show the previous letter in the English alphabet (if it was showing ‘a’, then it changes to ‘z’).

It is also possible to move any subsequence of contiguous wheels in the same direction with only one movement. This has the same effect of moving each of the

wheels within the subsequence on that direction, but saves the effort of doing that one wheel at a time.The lock openswhen the wheels show a secret sequence of l

etters. Currently all wheels are showing the letter ‘a’. Vic wants to know the minimum number of movements you need to open the lock.

Input

The input has several test cases. Each of them is given in exactly one line containing a nonempty string of at most 1000 lowercase letters. The string represents

the secret sequence of letters that opens the lock.

Output

For each test case, output a line containing a single integer with the minimum number of movements to open the lock.

Sample Input

abcxyz
abcdefghijklmnopqrstuvwxyz
aaaaaaaaa
zzzzzzzzz
zzzzbzzzz
*

Sample Output

525013



题意:
给你一个字符串,每次能够选择一个子串ss,将ss总体+1或者总体-1,a+1=b,a+1=a。要将全部字符全变为a,问最小的步数。

思路:
能够想到两种属性相反的操作(一加一减)不可能重叠,假设重叠的话。能够改动它们到不重叠也达到同样的效果。然后每一个字符就是通过一系列'+'操作或者‘-’操作(仅仅能选其1)得到a的。可是能够+或者-非常多次,不信能够看这个样例。mtezqh。答案为30.
dn[i][j]表示到将前i个字符所有变为a,最后一个字符‘-’j圈(假设j=0,仅仅需操作s[j]-'a'次)最小步数。
up[i][j]表示到将前i个字符所有变为a,最后一个字符‘+’j圈(假设j=0。仅仅需操作‘a+'26-s[j]-次)最小步数。
然后递推就可以。


代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#define maxn 1005
#define MAXN 200005
#define INF 0x3f3f3f3f
#define mod 20140518
#define eps 1e-6
const double pi=acos(-1.0);
typedef long long ll;
using namespace std; int n,m;
int up[maxn][40],dn[maxn][40];
char s[maxn]; void solve()
{
int i,j,k;
n=strlen(s+1);
memset(dn,0x3f,sizeof(dn));
memset(up,0x3f,sizeof(up));
dn[1][0]=s[1]-'a';
up[1][0]='a'+26-s[1];
for(i=1; i<n; i++)
{
for(j=0; j<30; j++)
{
if(s[i+1]==s[i])
{
dn[i+1][j]=dn[i][j];
up[i+1][j]=up[i][j];
}
else if(s[i+1]<s[i])
{
if(dn[i][j]<INF)
{
dn[i+1][j]=min(dn[i+1][j],dn[i][j]);
if(j>0) dn[i+1][j-1]=min(dn[i+1][j-1],dn[i][j]);
dn[i+1][j+1]=min(dn[i+1][j+1],dn[i][j]+s[i+1]-s[i]+26);
up[i+1][0]=min(up[i+1][0],dn[i][j]+'a'+26-s[i+1]);
}
if(up[i][j]<INF)
{
up[i+1][j]=min(up[i+1][j],up[i][j]+s[i]-s[i+1]);
if(j>0) up[i+1][j-1]=min(up[i+1][j-1],up[i][j]);
up[i+1][j+1]=min(up[i+1][j+1],up[i][j]+s[i]-s[i+1]+26);
dn[i+1][0]=min(dn[i+1][0],up[i][j]+s[i+1]-'a');
}
}
else
{
if(dn[i][j]<INF)
{
dn[i+1][j]=min(dn[i+1][j],dn[i][j]+s[i+1]-s[i]);
if(j>0) dn[i+1][j-1]=min(dn[i+1][j-1],dn[i][j]);
dn[i+1][j+1]=min(dn[i+1][j+1],dn[i][j]+s[i+1]-s[i]+26);
up[i+1][0]=min(up[i+1][0],dn[i][j]+'a'+26-s[i+1]);
}
if(up[i][j]<INF)
{
up[i+1][j]=min(up[i+1][j],up[i][j]);
if(j>0) up[i+1][j-1]=min(up[i+1][j-1],up[i][j]);
up[i+1][j+1]=min(up[i+1][j+1],up[i][j]+s[i]-s[i+1]+26);
dn[i+1][0]=min(dn[i+1][0],up[i][j]+s[i+1]-'a');
}
}
}
}
int ans=min(dn[n][0],up[n][0]);
printf("%d\n",ans);
}
int main()
{
while(~scanf("%s",s+1))
{
if(s[1]=='*') break ;
solve();
}
return 0;
}
/*
mtezqh
ans 30 e -26-e
*/

525013

cug oj 1479 Treasure Chest Lock (区间dp 思维)的更多相关文章

  1. 【BZOJ】2101: [Usaco2010 Dec]Treasure Chest 藏宝箱(dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2101 这个dp真是神思想orz 设状态f[i, j]表示i-j先手所拿最大值,注意,是先手 所以转移 ...

  2. Light OJ 1031 - Easy Game(区间DP)

    题目大意: 给你一个n,代表n个数字,现在有两个选手,选手A,B轮流有有一次机会,每个选手一次可以得到一个或者多个数字,从左侧或者右侧,但是不能同时从两边取数字,当所有的数字被取完,那么游戏结束.然后 ...

  3. codeforces 1140D(区间dp/思维题)

    D. Minimum Triangulation time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  4. BZOJ 2121: 字符串游戏 区间DP + 思维

    Description BX正在进行一个字符串游戏,他手上有一个字符串L,以及其他一些字符串的集合S,然后他可以进行以下操作:对 于一个在集合S中的字符串p,如果p在L中出现,BX就可以选择是否将其删 ...

  5. Light oj 1044 - Palindrome Partitioning(区间dp)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1044 dp[i][j]表示i到j直接的最小回文区间个数,直接看代码 #include ...

  6. HDU 2476 String painter(区间DP+思维)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2476 题目大意:给你字符串A.B,每次操作可以将一段区间刷成任意字符,问最少需要几次操作可以使得字符串 ...

  7. 题解——洛谷P4767 [IOI2000]邮局(区间DP)

    这题是一道区间DP 思维难度主要集中在如何预处理距离上 由生活经验得,邮局放在中间显然最优 所以我们可以递推求出\( w[i][j] \)表示i,j之间放一个邮局得距离 然后设出状态转移方程 设\( ...

  8. 区间DP小结

    也写了好几天的区间DP了,这里稍微总结一下(感觉还是不怎么会啊!). 但是多多少少也有了点感悟: 一.在有了一点思路之后,一定要先确定好dp数组的含义,不要模糊不清地就去写状态转移方程. 二.还么想好 ...

  9. BZOJ 2101 [Usaco2010 Dec]Treasure Chest 藏宝箱:区间dp 博弈【两种表示方法】【压维】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2101 题意: 共有n枚金币,第i枚金币的价值是w[i]. 把金币排成一条直线,Bessie ...

随机推荐

  1. Vmware复制完好的linux目录后网卡操作

    目录 Vmware复制完好的linux目录后网卡操作 修改/etc/udev/rules.d/70-persistent-net.rules 修改网卡配置文件 重启查看 Vmware复制完好的linu ...

  2. 聊聊、Nginx 初始化错误信息

    这篇文章我们继续学习 main 方法,我们先来看看 ngx_debug_init() 这个方法. 从方法名我们也知道,debug初始化.我们先看看方法位置在哪.我们来断点在这个方法上面. Functi ...

  3. 股票交易(DP+单调队列优化)

    题目描述 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未来T天内某只股票的走势,第i天的股票买入价为每股APi, ...

  4. 九度oj 题目1458:汉诺塔III

    题目描述: 约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下.由小到大顺序串着由64个圆盘构成的塔.目的是将最左边杆上的盘全部移到右边的杆上,条件是一次只能移动 ...

  5. TCP/IP(域名DNS)

    域名是不带http://的. 有DNS就能解析域名,只要联网,不用担心你的域名和IP无法映射起来. 当然,域名和IP的映射也可以通过本地hosts文件(优先于DNS)添加.C:\Windows\Sys ...

  6. 常用快捷键以及linux命令整理

    关于快捷键的使用,网上有很多.自己在使用过程中不断整理用到的知识点.一个项目完成了就把涉及用到的快捷键和命令介绍给大家,都是一些比较基础的,常用的命令.希望大家有好的知识点,命令可以及时交流整理. 一 ...

  7. Junit框架使用--JUnit常用断言及注解

    从别人博客中抄过来一点东西 原文地址:http://blog.csdn.net/wangpeng047/article/details/9628449 断言是编写测试用例的核心实现方式,即期望值是多少 ...

  8. zoj 3790 Consecutive Blocks 离散化+二分

    There are N (1 ≤ N ≤ 105) colored blocks (numbered 1 to N from left to right) which are lined up in ...

  9. UVa1476 Error Curves

    画出函数图像后,发现是一个类似V字型的图. 可以用三分法找图像最低点 WA了一串,之后发现是读入优化迷之被卡. /*by SilverN*/ #include<iostream> #inc ...

  10. 头条PC端的鼠标经过图片放大效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...