程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> SERC2013 J You Win!

SERC2013 J You Win!

編輯:C++入門知識

裝壓DP......

http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11450

J: You Win!
You just achieved the High Score on your favorite video game! Now, you get to enter
your name! You have to use the controller to enter your name, which can be awkward.
Here’s how it works:
 There are only the 26 capital letters A to Z, in order. There are no numbers,
spaces, lower case letters, or any other characters.
 Pushing UP or DOWN changes the active letter one letter forward (UP) or
backward (DOWN). The active letter starts at A. It will not reset when you move
around in the name. It also wraps: UP from Z goes to A, DOWN from A goes to Z.
 Pushing LEFT or RIGHT moves the cursor one letter left or right in the current
name. Note that once the cursor is at either end of the current name, it cannot
move any further in that direction.
 Pushing the FIRE button adds the active letter to the name.
For example, consider the name ‘ALMA’. One way you could enter ‘ALMA’ is like this:
Action # of Pushes Name (| = Cursor) Active Letter
FIRE 1 A| A
UP 11 A| L
FIRE 1 AL| L
UP 1 AL| M
FIRE 1 ALM| M
DOWN 12 ALM| A
FIRE 1 ALMA| A
This would take 28 button pushes. However, consider entering ‘ALMA’ like this:
Action # of Pushes Name (| = Cursor) Active Letter
FIRE 1 A| A
FIRE 1 AA| A
LEFT 1 A|A A
UP 11 A|A L
FIRE 1 AL|A L
UP 1 AL|A M
FIRE 1 ALM|A M
2013 ACM ICPC Southeast USA Regional Programming Contest
Page 16 of 16 2 November, 2013
This takes only 17 button pushes. Given a name, what is the fewest number of button
pushes needed to enter that name? Assume that the active letter starts at A, and that it
doesn’t matter where the cursor ends up when you’re done.
Input
There will be several test cases in the input. Each test case will consist of a single string
on its own line, with from 1 to 18 capital letters, representing a name that must be
entered into the High Score list. The input will end with a line with a single 0.
Output
For each test case, output a single integer representing the smallest number of button
pushes needed to enter the name. Output no spaces, and do not separate answers with
blank lines.
Sample Input
ALMA
YES
0
Sample


#include 
#include 
#include 
#include 

using namespace std;

const int INF=0x3f3f3f3f;

int dp[1<<19][19],n;
char str[20];

int getD(char a,char c)
{
    if(a>c) swap(a,c);
    return min(c-a,a-'A'+'Z'-c+1);
}

int getSHIFT(int from,int to,int st)
{
    int ans=0;
    if(fromto-1;i--)
        {
            if(st&(1<狀態i
            for(int jj=1;jj<=n;jj++)///枚舉狀態ii的光標位置
            {
                if((ii&(1<<(jj-1)))==0) continue;
                dp[i][j]=min(dp[i][j],dp[ii][jj]+getD(str[jj-1],str[j-1])+getSHIFT(jj,j,ii)+1);
            }
        }
    }
    int ans=INF;
    for(int i=1;i<=n;i++) ans=min(ans,dp[(1<



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved