SERC2013 J.You Win!

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

比赛是初始化写错了。。。。。。太挫了。。。。。。。。

///You Win!
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
#include<cstring>
#define N 1005
#define inf 0xfffffff
#define inf1 0x3f3f3f3f
using namespace std;
char str[33];
int bit[44];
int n,m;
int dp[1<<18+2][20];
#define prt(k) cout<<#k"="<<k<<"\t";
int dist(int a,int b)
{
    return min(abs(a-b),26-abs(a-b));       //min((a-b+26)%26,(b-a+26)%26);
}
int f(int s,int j,int k)
{
    int res=0;
    if(k<j) swap(k,j),res=1;
    for(int i=j+1; i<k; i++)
        if(s&(1<<i))
            res++;
    return res;
}
int main()
{
    ///prt(inf-inf1); prt(inf1);
    while(scanf("%s",str)==1&&str[0]!='0')
    {
        // memset(dp,63,sizeof dp);
        n=strlen(str);
        for(int i=0; i<(1<<n); i++) for(int j=0; j<=n; j++) dp[i][j]=inf;
        dp[0][0]=0;

        for(int i=0; i<n; i++) bit[i]=str[i]-'A'; //,prt(bit[i]);
        for(int i=0; i<n; i++)
            dp[1<<i][i+1]=dist(bit[i],0)+1;   //,prt(dp[1<<i][1]);
        for(int i=0; i<(1<<n); i++)
            for(int j=0; j<n; j++)  ///input jth character last
            {
                if(dp[i][j+1]>=inf) continue;
                if(!(i&(1<<j))) continue;
                for(int k=0; k<n; k++)  ///input kth cursor
                {
                    if(i&(1<<k)) continue;
                   
                    dp[i|1<<k][k+1]=min(dp[i|1<<k][k+1],dp[i][j+1]+dist(bit[k],bit[j])+f(i,j,k)+1);
                    // prt(dp[i|1<<k][k+1]);
                  //  printf("dp[%d][%d]=%d\n",i|1<<k,k+1,dp[i|1<<k][k+1]);
                    //cout<<endl;
                }
            }
        int ans=inf;
        for(int i=0; i<(1<<n); i++)
        {
            for(int j=0; j<=n; j++)
                if(dp[i][j]<inf)
                {
                //    printf("dp[%d][%d]=%d  ",i,j,dp[i][j]);   //prt(i); prt(j); prt(dp[i][j]);
                }
            //puts("");
        }
        for(int i=0; i<=n; i++) ans=min(ans,dp[(1<<n)-1][i]);
        printf("%d\n",ans);
    }
}


你可能感兴趣的:(SERC2013 J.You Win!)