青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

TC-SRM-454_div2

Posted on 2009-12-13 10:18 rikisand 閱讀(323) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): TopcoderAlgorithm

200pt( 略)

500pt

Problem Statement

You are playing a game with a NxN grid of letters. The goal of the game is to spell out a N-letter word somewhere on the grid either horizontally from left to right or vertically from top to bottom. To achieve this, you will perform a series of moves. On each move, you can swap either two rows or two columns of the grid.
You are given a vector <string> grid containing the initial state of the grid. The j-th character of the i-th element of grid is the letter at row i, column j. The word you must spell is given to you in the string word. All letters in word are distinct. Note that lowercase and uppercase versions of the same letter are considered different in this problem, so 'A' and 'a' are distinct. Return the minimal number of moves required to spell the given word on the grid, or -1 if it is impossible.

Definition

Class:
WordsGame

Method:
minimumSwaps

Parameters:
vector <string>, string

Returns:
int

Method signature:
int minimumSwaps(vector <string> grid, string word)

(be sure your method is public)

Constraints

-
word will contain between 1 and 50 letters ('a'-'z', 'A'-'Z'), inclusive.

-
All characters in word will be distinct.

-
The number of elements in grid will be equal to the length of word.

-
The length of each element of grid will be equal to the length of word.

-
Each element of grid will contain only letters ('a'-'z', 'A'-'Z').

 

首先考慮到只有當(dāng)前行或者列包含所有word中的char 才可能通過(guò)調(diào)換得到word ,而且調(diào)換并不影響各個(gè)行列的內(nèi)容,因此首先排序判等。

問(wèn)題轉(zhuǎn)化為word的一個(gè)permutation 最少通過(guò)幾次調(diào)換可以得到word

在permutation中,有cyclic representation的概念 :

例如 word = “abcd” sword = “adbc”即 要將 1423 轉(zhuǎn)換為 1234

那么1是一個(gè)cycle 423是一個(gè)cycle

要打破一個(gè)cycle 則需要元素- 1 次操作,我們要得到的即為所有cycle都為長(zhǎng)度1

因此算法為:

#define REP(i,n) for(int (i)=0;i<n;i++)
 template<class T> void getMin(T& a,T b){if(b<a)a=b;}
template<class T> void getMax(T& a,T b){if(b>a)a=b;}  
int N ;
#define inf 99999999
string target;
int cacl2(string str){
    vector<int> vec(N);
    REP(i,N) vec[i] = target.find(str[i]);
    int ans=0;
    REP(i,N){
        int cnt=0; 
        int next = i;
        if(vec[next] != -1){
            while(vec[next] != -1){
                int tmp = next;
                next = vec[next];
                vec[tmp] = -1;
                cnt ++;
            }
            cnt --;
        }
        ans+=cnt;
    }
    return ans;
}
int cacl(string str){
    map<char,int> mp;
    REP(i,N)mp[str[i]] = i;
    bool flag = true;
    int ans = 0 ;
    while(true){
        flag = true;
        REP(i,N){
            if(str[i] != target[i]){
                str[mp[target[i]]] = str[i];
                mp[str[i]] = mp[target[i]];
                str[i] = target[i];
                flag = false;
                ans++;
            }
        }
        if(flag) break;
    }
    return ans;
}
class WordsGame
{
        public:
        int minimumSwaps(vector <string> grid, string word)
        {
                N = word.size();
                string sword = word;
                target = word;
                sort(sword.begin(),sword.end());
                int ans = inf;
                REP(i,N){
                    string str= grid[i];
                    string sstr = str;
                    sort(sstr.begin(),sstr.end());
                    if(sstr == sword)
                        getMin(ans,cacl2(str));
                }
                REP(i,N)
                    {
                    string str = "" ;
                    REP(j,N)str+= grid[j][i];
                    string sstr = str;
                    sort(sstr.begin(),sstr.end());
                    if(sstr == sword)
                         getMin(ans,cacl2(str));
                    }
                if(ans==inf)return -1;
                return ans;
        }
        

1000pt

Problem Statement

You have a piece of paper with exactly D positions laid out in a horizontal row. Each position looks like the following:

 _
|_|
|_|

There are 7 line segments in each position, and each line segment can hold exactly one match. Matches cannot be placed anywhere except on the line segments.
You are given an integer N containing exactly D digits (with no leading zeroes). Spell out the number using matches on the paper. Each digit must occupy a single position. The following diagram shows how each digit should be formed:
      _	               _        _                 _       _        _        _        _
 0 - | |  1 -  |  2 -  _|  3 -  _|  4 - |_|  5 - |_  6 - |_   7 -   |  8 - |_|  9 - |_|
     |_|      _|      |_        _|        |       _|     |_|        |      |_|       _|

After you lay out the initial arrangement, you are allowed to move up to K matches. You cannot discard matches or add new matches. After you make all your moves, the final arrangement must be valid (as described above) and the integer formed by the arrangement must contain the same number of digits as the original integer. Leading zeroes are allowed. Return the number of distinct integers that can be formed in this manner. Note that the original integer counts toward the total because it always obtainable by making 0 moves.
Definition

Class:
NumbersAndMatches

Method:
differentNumbers

Parameters:
long long, int

Returns:
long long

Method signature:
long long differentNumbers(long long N, int K)

(be sure your method is public)

Constraints

-
N will be between 1 and 10^18 - 1, inclusive.

-
K will be between 1 and 126, inclusive.

Examples

0)

10
1
Returns: 4

Here you can compose numbers 10, 19, 16 and 70:

      _                     _
  |  | |     ----->     |  | |
 _|  |_|               _|  |_|
      _                     _
  |  | |     ----->     |  |_|
 _|  |_|               _|   _|
      _                     _
  |  | |     ----->     |  |_ 
 _|  |_|               _|  |_|
      _                _    _
  |  | |     ----->     |  | |
 _|  |_|                |  |_|

1)

23
1
Returns: 4

This time it's possible to compose 22, 23, 25 and 33.

2)

66
2
Returns: 15

Here you can move up to 2 matches, so quite a lot of numbers can be composed. Note that you are allowed to move a match from one digit to another one, so, for example, it's possible to compose 38. However, you can't discard a match or add a new match, so, for example, you can't compose 55 or 88.

3)

888888888
100
Returns: 1

You are allowed to move a lot of matches, but still it's only possible to compose 888888888.

4)

444444444444444444
2
Returns: 1

Given that at most 2 matches can be moved, only the initial number can be composed.

 

7段碼的題,首先用數(shù)組記錄10個(gè)數(shù)字的七段碼,這樣比較兩個(gè)數(shù)字需要移動(dòng)的火柴個(gè)數(shù)只需要比較七個(gè)位子上兩者的關(guān)系即可。而后考慮執(zhí)行到第k個(gè)數(shù)字時(shí)候,已經(jīng)添加了inc個(gè)火柴,減去了dec個(gè)火柴,那么要求這個(gè)數(shù)字的改變能得到的數(shù)字?jǐn)?shù)目只需要枚舉變成10個(gè)數(shù)字即可,最終如果inc和dec相等則滿(mǎn)足題意。因此用dp備忘錄或者使用遞推來(lái)求解,顯然遞推的效率更高但不容易想到下面是代碼

回朔+memo

Code Snippet
typedef long long int64;  
typedef vector<int> VI;
typedef vector<string> VS;
#define REP(i, n) for (int i = 0; i < (n); ++i)
template<class T> inline void checkmin(T &a,const T &b) { if (b<a) a=b; }
template<class T> inline void checkmax(T &a,const T &b) { if (b>a) a=b; }

int dis[10][7]={
    {1,1,1,0,1,1,1},{0,0,1,0,0,1,1},
    {1,0,1,1,1,0,1},{1,0,1,1,0,1,1},
    {0,1,1,1,0,1,0},{1,1,0,1,0,1,1},
    {1,1,0,1,1,1,1},{1,0,1,0,0,1,0},
    {1,1,1,1,1,1,1},{1,1,1,1,0,1,1}
};
int K,N,A[30];
int64 memo[30][128][128];
int64 solve(int depth,int inc,int dec){
    if(depth == N)return inc==dec?1:0;
    if(memo[depth][inc][dec] != -1)return memo[depth][inc][dec];
    memo[depth][inc][dec]=0;
    int64& ret=memo[depth][inc][dec];
    REP(i,10){
        int more=0,less=0;
        REP(j,7){
            if(dis[i][j] == 1 && dis[A[depth]][j] == 0)
                more++;
            if(dis[i][j] == 0 && dis[A[depth]][j] == 1)
                less++;
        }
        if(more+inc>K||dec+less>K) continue;
        ret += solve(depth+1,inc+more,less+dec);
    }
    return ret;
}
class NumbersAndMatches
{
        public:
        long long differentNumbers(long long _N, int _K)
        {
               K=_K;N=0;
               memset(memo,-1,sizeof(memo));
               while(_N>0){
                    A[N++]=_N%10;_N/=10;
               }
               return solve(0,0,0);
        }

 

遞推的:

typedef long long int64;  
typedef vector<int> VI;
typedef vector<string> VS;
 
#define REP(i, n) for (int i = 0; i < (n); ++i) 
 
#define two(X) (1<<(X))
#define contain(S,X) ((S&two(X))>0)
int dis[10][7]={
    {1,1,1,0,1,1,1},{0,0,1,0,0,1,1},
    {1,0,1,1,1,0,1},{1,0,1,1,0,1,1},
    {0,1,1,1,0,1,0},{1,1,0,1,0,1,1},
    {1,1,0,1,1,1,1},{1,0,1,0,0,1,0},
    {1,1,1,1,1,1,1},{1,1,1,1,0,1,1}
};
int64 dp[128][128];
class NumbersAndMatches
{
        public:
        long long differentNumbers(long long N, int K)
        {
               REP(i,K+1)REP(j,K+1) dp[i][j] = !i && !j;
               while(N>0){
                    int now = N%10;N/=10;
                    for(int i=K;i>=0;i—)//注意計(jì)算順序要從大向小,因?yàn)閺男∠虼髸?huì)更新大的數(shù)組值~
                        for(int j=K;j>=0;j--){
                            if(dp[i][j]){
                                int64 x = dp[i][j];
                                dp[i][j] = 0;
                                REP(y,10){
                                    int inc=0,dec=0;
                                    REP(z,7)    {
                                        if(dis[y][z]==0 && dis[now][z]==1)
                                            dec++;
                                        if(dis[y][z]==1 && dis[now][z]==0)
                                            inc++;
                                    }
                                    if(inc+i>K||dec+j>K)continue;
                                    dp[i+inc][j+dec] += x;
                                }
                            }
                    }
                   }
               int64 ret=0;
               REP(i,K+1) ret+=dp[i][i];
               return ret;
        }

只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            午夜精品久久久久久久99樱桃 | 欧美日韩在线另类| 久久久999国产| 久久精选视频| 麻豆精品在线视频| 久久精品亚洲精品国产欧美kt∨| 久久久久久综合| 蜜臀久久99精品久久久画质超高清| 久久精品国产一区二区电影 | 99视频精品全国免费| 一本色道久久综合亚洲精品不| 久久久久久999| 欧美高清在线一区| 欧美日韩精品二区| 国产精品午夜国产小视频| 国产日韩在线视频| 精品1区2区3区4区| 亚洲精品自在久久| 亚洲女人天堂成人av在线| 久久青青草综合| 亚洲精选视频在线| 欧美一区二区久久久| 久久中文字幕导航| 国产精品视频一区二区三区| 亚洲国产精品激情在线观看| 亚洲欧美激情一区| 亚洲国产99| 99精品欧美一区二区三区| 午夜日韩视频| 欧美三级视频在线观看| 黄色一区三区| 亚洲神马久久| 欧美成人一品| 一本久久知道综合久久| 久久精品五月| 欧美先锋影音| 亚洲国产精品精华液2区45| 欧美在线观看一二区| 亚洲理论电影网| 老司机一区二区| 国产亚洲欧洲997久久综合| 一区二区三区免费观看| 久久香蕉国产线看观看av| 亚洲人精品午夜| 裸体一区二区三区| 韩国欧美一区| 欧美一区二区大片| 一区二区三区视频免费在线观看| 国产精品久久久久影院亚瑟| 亚洲第一福利社区| 久久精品国产一区二区三区免费看| 亚洲成人在线视频网站| 亚洲中字在线| 国产精品日韩久久久| 一本色道久久99精品综合 | 午夜精品福利一区二区三区av| 久久一二三四| 国内一区二区在线视频观看| 性欧美办公室18xxxxhd| 99视频精品全部免费在线| 你懂的网址国产 欧美| 在线观看视频一区| 欧美超级免费视 在线| 久久一区二区三区超碰国产精品| 国产精品丝袜xxxxxxx| 午夜国产一区| 亚洲在线播放| 国产欧美日韩三区| 久久精品盗摄| 久久另类ts人妖一区二区| 极品av少妇一区二区| 欧美成人乱码一区二区三区| 欧美福利视频网站| 亚洲特级片在线| 午夜精品久久久久久久蜜桃app| 欧美视频一区二区三区在线观看 | 欧美一区网站| 韩国精品主播一区二区在线观看| 免费的成人av| 欧美激情视频网站| 亚洲一区二区av电影| 亚洲欧美日韩视频一区| 伊人精品成人久久综合软件| 亚洲二区免费| 欧美少妇一区二区| 久久精品国产99| 欧美va亚洲va国产综合| 亚洲深夜福利在线| 欧美一区二区三区成人| 亚洲欧洲一区二区三区| 亚洲视频精选在线| 在线电影欧美日韩一区二区私密| 最新国产成人av网站网址麻豆| 欧美日韩亚洲三区| 久久亚洲国产精品日日av夜夜| 你懂的网址国产 欧美| 亚洲网站视频| 狼人社综合社区| 亚洲欧美在线看| 老牛影视一区二区三区| 亚洲一区尤物| 久久婷婷综合激情| 午夜精品美女久久久久av福利| 久久综合五月天婷婷伊人| 亚洲精品在线观看免费| 小嫩嫩精品导航| 亚洲精品影视| 欧美一区国产在线| 亚洲一区二区三区精品在线 | 欧美在线观看一区| 亚洲一区不卡| 欧美黑人在线观看| 久久九九电影| 国产九区一区在线| 99精品国产一区二区青青牛奶| 精品成人久久| 性欧美办公室18xxxxhd| 亚洲香蕉视频| 欧美日本中文字幕| 欧美激情成人在线视频| 国产麻豆视频精品| 在线亚洲一区二区| 一本色道久久99精品综合| 美女日韩在线中文字幕| 麻豆精品一区二区av白丝在线| 国产精品免费一区豆花| 亚洲美女视频在线免费观看| 91久久一区二区| 久久亚洲影院| 麻豆精品网站| 在线观看日韩av电影| 欧美主播一区二区三区美女 久久精品人| 亚洲图色在线| 国产精品成人aaaaa网站| 91久久久久久久久久久久久| 亚洲激情中文1区| 女生裸体视频一区二区三区| 久久综合一区二区三区| 狠狠色丁香久久婷婷综合丁香| 小黄鸭视频精品导航| 久久免费高清视频| 国产一区二区欧美日韩| 久久久久久久久伊人| 欧美国产综合| 99精品国产99久久久久久福利| 欧美精品成人在线| 在线视频欧美日韩| 欧美在线精品一区| 伊人天天综合| 欧美aa在线视频| 日韩一区二区免费看| 午夜精品影院| 激情国产一区| 欧美成人精品| 亚洲视频在线观看网站| 久久精品二区三区| 亚洲黄色在线| 欧美日韩中文精品| 性做久久久久久免费观看欧美| 麻豆成人在线| 亚洲一区二区免费视频| 国产在线高清精品| 欧美精品一卡| 午夜天堂精品久久久久| 欧美成人一区二区三区在线观看 | 欧美区二区三区| 亚洲一区成人| 欧美大片免费久久精品三p | 9l国产精品久久久久麻豆| 中文在线不卡| 国产日韩欧美麻豆| 久久综合网络一区二区| 日韩一级在线观看| 欧美**人妖| 亚洲欧美日韩在线一区| 亚洲第一区在线观看| 欧美日韩岛国| 久久人人97超碰精品888| 99精品免费视频| 亚洲大片免费看| 欧美在线一级va免费观看| 日韩一级裸体免费视频| 国产一二三精品| 欧美日韩成人综合在线一区二区 | 欧美三区不卡| 久久免费视频这里只有精品| 9人人澡人人爽人人精品| 久久青草欧美一区二区三区| 亚洲欧美激情在线视频| 亚洲日本欧美| 国内精品一区二区三区| 国产精品v欧美精品v日韩精品| 久久综合中文字幕| 性做久久久久久久免费看| 99天天综合性| 亚洲精品日韩一| 亚洲国产另类 国产精品国产免费| 久久国产天堂福利天堂| 亚洲中字在线| 亚洲午夜精品17c|