poj 2817 WordStack

來源:互聯網
上載者:User

Description

As editor of a small-town newspaper, you know that a substantial number of your readers enjoy the daily word games that you publish, but that some are getting tired of the conventional crossword puzzles and word jumbles that you
have been buying for years. You decide to try your hand at devising a new puzzle of your own.

Given a collection of N words, find an arrangement of the words that divides them among N lines, padding them with leading spaces to maximize the number of non-space characters that are the same as the character immediately above them on the preceding line.
Your score for this game is that number.

Input

Input data will consist of one or more test sets.

The first line of each set will be an integer N (1 <= N <= 10) giving the number of words in the test case. The following N lines will contain the words, one word per line. Each word will be made up of the characters 'a' to 'z' and will be between 1 and 10
characters long (inclusive).

End of input will be indicated by a non-positive value for N .

Output

Your program should output a single line containing the maximum possible score for this test case, printed with no leading or trailing spaces.

Sample Input

5 abc bcd cde aaa bfcde 0

Sample Output

8

Hint

Note: One possible arrangement yielding this score is:
aaa abc  bcd  cde bfcde

Source

Mid-Atlantic 2005

簡單狀態dp

題意就是給10個字串,讓你求一個順序,使得相鄰兩個串(可以錯位)相同位置的字元和最多……我也說不清楚,看Hint就很明顯了。

但是要注意abc和adc算2個重複的字元……在這裡wa了一次。

上代碼吧

#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;char map[105][105];int dp[(1<<11)+2][14];int val[15][15];int Count(char *p,char *q){    int i,j,n,m,cnt,ret,k;    ret=0;    n=strlen(p);    m=strlen(q);    for (i=0;i<n;i++)    {        for (j=0;j<m;j++)        {            cnt=0;            for (k=0;;k++)            {                if (i+k>=n || j+k>=m) break;                if (p[i+k]==q[j+k]) cnt++;            }            ret=max(ret,cnt);        }    }    return ret;}int main(){    int i,j,p,n,k,ret;    while(1)    {        scanf("%d",&n);        if (n==0) break;        for (i=0;i<n;i++)        {            scanf("%s",map[i]);        }        for (i=0;i<n;i++)        {            for (j=i+1;j<n;j++)            {                val[i][j]=val[j][i]=Count(map[i],map[j]);            }        }        memset(dp,-1,sizeof(dp));        for (i=1;i<(1<<n);i++)        {            for (j=0;j<n;j++)            {                if (i==(1<<j)) break;            }            if (j<n)            {                dp[i][j]=0;            }            for (j=0;j<n;j++)            {                if ((i & (1<<j))!=0) continue;                p=(i | (1<<j));                for (k=0;k<n;k++)                {                    if ((i & (1<<k))==0) continue;                    if (dp[i][k]==-1) continue;                    dp[p][j]=max(dp[p][j],dp[i][k]+val[j][k]);                }            }        }        ret=0;        for (i=0;i<n;i++)        {            ret=max(ret,dp[(1<<n)-1][i]);        }        printf("%d\n",ret);    }    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.