这个题目上周的对抗赛的,美国2013区域赛的题目,上次比赛真惨,就做出一道题,最多的也只做出两道,当时想把这题做出来,一直TLE。

这个题目用挂在Hunnu OJ的数据可以过,但UVALive上死活过不了,好像UVALive卡的时间不太对,没人过了这道题。

我当初是想用一个dp[s]表示键入状态,然后由dp[0]开始逐渐向上深搜,结果就TLE了,后来比较了一下别人的代码,,果然我这样还是不行

不管我怎么优化,我这一维数组,不能对某个状态马上就返回,因为随时可以再被更新,但是如果用个二维数组,dp[s][i],表示在状态为s的时候,键入第i个字符时候的最小键入数目,就可以只更新一次,下次再遇到这个情况就能马上return了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 18
#define INF 1<<30
using namespace std;
char ch[N];
int len,dp[<<N][N],ALL;
//int up[1<<N][N];
/*
int abs(int a,int b)
{
if (a>b) return a-b;
else return b-a;
}
*/
int diff(int a, int b) //这个函数和下面的函数都是计算转换字符的按键数,结果下面那个是错的,原因是在计算从Z字母转换过去的时候,下面那个算错了,没照顾到a在b的后面的情况。为了这个BUG我检查了好久 真不应该啊
{
int ans=abs(a-b);
return min(ans,'Z'-'A'-ans+);
}
int ccounts(char a,char b)
{
int asc1=a-'A';
int asc2=b-'A';
int z='Z'-'A';
int press=abs(asc1-asc2);
press=min((press),z-asc2++asc1);
return press; }
/*
void solve(int s,int d)
{
if (d==len) return;
//if (vis[s]) return;
vis[s]=1;
if (dp[ALL]<=dp[s]) return;
for (int i=0; i<len; i++)
{
if ((1<<i)&s) continue;
int nt=s+(1<<i);
int tmp;
//cout<<"p1"<<endl;
//if (up[s][i]==0)
//up[s][i]=counts(i,s,ch[i]);
tmp=dp[s]+counts(i,s,ch[i]);
//cout<<"p2"<<endl;
//cout<<tmp<<endl;
if (dp[nt]>tmp)
{
dp[nt]=tmp;
mouse[nt]=i+1;
action[nt]=ch[i]-'A';
solve(nt,d+1);
}
else
if (vis[nt]==0)
solve(nt,d+1);
//cout<<"p3"<<endl;
//cout<<dp[nt]<<endl; }
}
*/
int solve (int s,int last) //记忆化搜索
{
if (dp[s][last]) return dp[s][last];
if (s==) return ;
dp[s][last]=INF;
int pos=;
for (int i=;i<=last;i++)
{
if ((<<i)&s) pos++;
}
for (int i=,j=;i<len;i++)
{
if ((<<i)&s)
{
j++;
if (j==pos) continue;
int cur= j>pos? j-pos:pos-j-;
int rng=diff(ch[i],ch[last]);
dp[s][last]=min(dp[s][last],+cur+rng+solve(s^(<<last),i));
}
}
return dp[s][last]; }
int main()
{
//init();
while (scanf("%s",ch))
{
len=strlen(ch);
if (len== && ch[]=='') break;
memset(dp,,sizeof dp);
ALL=<<len;
ALL--;
for (int i=;i<len;i++)
{
dp[<<i][i]=diff('A',ch[i])+;
}
int ans=INF;
for (int i=;i<len;i++){
ans=min(ans,solve(ALL,i));
}
printf("%d\n",ans);
}
return ;
}

UVALive 6491 You win! 状态DP的更多相关文章

  1. hdu 4614 pieces 状态DP

    题意:给你一个长度小于等于16的字符串,每次可以删除一个回文传,问你最少删除干净的字数. 状态+dp dp[i] = min(dp[i],dp[j]+dp[j^i]);(j是i的字串): 连接:htt ...

  2. hdu 4778 Gems Fight! 博弈+状态dp+搜索

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4102743.html 题目链接:hdu 4778 Gems Fight! 博弈+状态dp+搜 ...

  3. POJ 3254 压缩状态DP

    题意:一个矩形网格,可以填0或1, 但有些位置什么数都不能填,要求相邻两个不同时为1,有多少种填法.矩形大小最大 12*12. 压缩状态DP大多有一个可行的state的范围,先求出这个state范围, ...

  4. 【状态DP】 HDU 1074 Doing Homework

    原题直通车:HDU  1074  Doing Homework 题意:有n门功课需要完成,每一门功课都有时间期限t.完成需要的时间d,如果完成的时间走出时间限制,就会被减 (d-t)个学分.问:按怎样 ...

  5. Hdu 4539 【状态DP】.cpp

    题意: 一个炮兵可以攻打和他之间曼哈顿距离为2的士兵,给出你一块n*m的战场,告诉你哪些地方可以站人哪些地方不可以,问你最多可以安放多少个士兵? n <= 100, m <= 10 思路: ...

  6. hihocoder第42周 3*N骨牌覆盖(状态dp+矩阵快速幂)

    http://hihocoder.com/contest/hiho42/problem/1 给定一个n,问我们3*n的矩阵有多少种覆盖的方法 第41周做的骨牌覆盖是2*n的,状态转移方程是dp[i] ...

  7. hdu 5135(2014广州—状态dp)

    t题意:给你n条边,构造任意个三角形,一个三角形恰好只用3条边,每条边只能一次,求面积最大值 思路: 最开始想的是先排序从大到小取,但感觉并不怎么靠谱. 最多12条边,所以可以求出所有可能的三角形面积 ...

  8. Hdu 3001 Travelling 状态DP

    题目大意 一次旅游,经过所有城市至少一次,并且任何一座城市访问的次数不能超过两次,求最小费用 每个城市最多访问两次,用状态0,1,2标识访问次数 把城市1~N的状态按照次序连接在一起,就组成了一个三进 ...

  9. lightoj 1244 - Tiles 状态DP

    思路:状态DP dp[i]=2*dp[i-1]+dp[i-3] 代码如下: 求出循环节部分 1 #include<stdio.h> 2 #define m 10007 3 int p[m] ...

随机推荐

  1. 神奇的i++

    神奇的i++ i++,++i,多简单啊,不需要深入研究吧!!! 我是这样想的. 直到我做了一道Java基础检测题,才发现,哦,原来是这样啊!!! 题是这样的 public class Demo { p ...

  2. node核心 http模块

    node作为服务器更多的是web服务器 1.http模块 首先:http是一个协议.里面有通信机制,状态码一大堆乱七八糟的东西.自己写猴年马月都写不出来,这个对象帮我们集成.直接用 服务器对象: ht ...

  3. 从ofo牵手理财平台看,用户隐私数据的使用有底线吗?

    智慧生活的到来既是社会变迁的拐点,又不可避免地带来一种挥之不去的焦虑.这种焦虑的由来,是因个人隐私数据在智慧生活下变成一种"黑暗财富".随着相关数据挖掘.收集.分析技术的成熟,人们 ...

  4. kNN.py源码及注释(python3.x)

    import numpy as npimport operatorfrom os import listdirdef CerateDataSet():        group = np.array( ...

  5. net GC 学习以及问题

    引用对象必要空间开销:对象指针.同步块索引 GC重要点: 每个应用程序包含一组根,每个根都是一个存储位置,其中包含指向引用类型对象的一个指针,该指针要么指向托管堆中的要给对象,要么为null.(这句话 ...

  6. VUE- Cordova打包APP

    VUE- Cordova打包APP 现在使用vue开发的项目越来越多,使用vue开发的移动端打包就成了最大的问题.现在前端打包方案有好多种,但是综合来说,我比较喜欢用cordova来进行Android ...

  7. v2??? 重启失败

    v2??? 重启失败, 提示 Authorization not available. Check if polkit service is running or see debug message ...

  8. 由sqli-labs/Less-5学习各种基础盲注技巧

    本文为本人在学习中的总结,仅涉及基础的盲注技巧,可能多有疏漏之处,欢迎指教. 另外本人博客的SQL注入分类下有一些方面的详细讲解,在此只介绍简单的使用. 0x00.介绍一下本人对盲注的总结. 盲注就是 ...

  9. jedis哨兵模式的redis组(集群),连接池实现。(客户端分片)

    java 连接redis 我们都使用的 是jedis  ,对于redis这种频繁请求的场景我们一般需要对其池化避免重复创建,即创建一个连接池 ,打开jedis的 jar包我们发现,jedis对池已经有 ...

  10. Channel详解

    复制自:http://www.cnblogs.com/youngKen/p/4921092.html java.nio.channels.FileChannel封装了一个文件通道和一个FileChan ...