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

TC-SRM-454_div2

Posted on 2009-12-13 10:18 rikisand 閱讀(323) 評論(0)  編輯 收藏 引用 所屬分類: 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 才可能通過調(diào)換得到word ,而且調(diào)換并不影響各個行列的內(nèi)容,因此首先排序判等。

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

在permutation中,有cyclic representation的概念 :

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

那么1是一個cycle 423是一個cycle

要打破一個cycle 則需要元素- 1 次操作,我們要得到的即為所有cycle都為長度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個數(shù)字的七段碼,這樣比較兩個數(shù)字需要移動的火柴個數(shù)只需要比較七個位子上兩者的關(guān)系即可。而后考慮執(zhí)行到第k個數(shù)字時候,已經(jīng)添加了inc個火柴,減去了dec個火柴,那么要求這個數(shù)字的改變能得到的數(shù)字?jǐn)?shù)目只需要枚舉變成10個數(shù)字即可,最終如果inc和dec相等則滿足題意。因此用dp備忘錄或者使用遞推來求解,顯然遞推的效率更高但不容易想到下面是代碼

回朔+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—)//注意計算順序要從大向小,因為從小向大會更新大的數(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;
        }

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   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>
            欧美一区二区视频在线| 欧美二区在线观看| 欧美va天堂在线| 你懂的网址国产 欧美| 久久婷婷丁香| 麻豆成人在线| 亚洲国产欧美在线| 亚洲高清在线观看| 日韩一级大片在线| 午夜在线不卡| 久久久伊人欧美| 欧美精品v日韩精品v韩国精品v| 欧美国产日产韩国视频| 欧美午夜久久久| 国产日韩亚洲欧美精品| 亚洲第一福利视频| 一区二区三区黄色| 欧美一区二区三区四区高清 | 国产精品九九| 精品999日本| 一本色道**综合亚洲精品蜜桃冫| 欧美亚洲系列| 亚洲精品免费看| 欧美在线播放视频| 欧美精品少妇一区二区三区| 国产亚洲欧美一区| 亚洲一区视频在线观看视频| 欧美高清视频免费观看| 午夜精品久久久久99热蜜桃导演| 欧美激情在线免费观看| 激情文学一区| 欧美尤物一区| 亚洲无限av看| 欧美日韩一区二区在线| 亚洲欧洲在线观看| 老司机免费视频久久| 亚洲午夜久久久| 欧美成人午夜激情| 在线免费观看日韩欧美| 久久精品国产v日韩v亚洲| 亚洲激情视频在线| 久久久蜜桃精品| 国产视频精品va久久久久久| 中文久久乱码一区二区| 亚洲成色最大综合在线| 久久九九热免费视频| 国产欧美欧洲在线观看| 亚洲综合日韩| 夜色激情一区二区| 欧美日韩理论| 99riav久久精品riav| 欧美电影美腿模特1979在线看 | 美女国内精品自产拍在线播放| 欧美激情一区二区在线| 韩国福利一区| 久久狠狠一本精品综合网| 一本色道久久综合亚洲精品按摩| 欧美成人精品福利| 亚洲国产专区| 91久久国产综合久久91精品网站| 久久综合网络一区二区| 伊人成年综合电影网| 久久精品视频亚洲| 久久av一区二区三区亚洲| 国产一区二区三区四区hd| 久久久久欧美精品| 久久久精品999| 精品91在线| 欧美成人精品激情在线观看| 久久手机精品视频| 亚洲欧洲精品一区二区三区 | 黄色成人精品网站| 久久亚洲精品中文字幕冲田杏梨| 久久成人av少妇免费| 韩日精品视频一区| 欧美高清视频一区二区三区在线观看 | 99国产精品99久久久久久粉嫩| 欧美超级免费视 在线| 亚洲美女视频在线观看| 一区二区三区.www| 国产一区二区三区黄| 欧美丰满高潮xxxx喷水动漫| 欧美久久久久久久| 午夜视频在线观看一区二区三区| 午夜视频久久久久久| 亚洲大胆视频| av不卡在线观看| 国产亚洲永久域名| 欧美14一18处毛片| 欧美日韩国产一中文字不卡| 欧美伊人影院| 欧美经典一区二区三区| 欧美在线视频日韩| 麻豆精品在线视频| 亚洲一区二区三区四区五区午夜| 欧美一区二区三区在线观看视频| 亚洲国产精品va在线看黑人| 99re亚洲国产精品| 国内精品久久久久久| 亚洲片国产一区一级在线观看| 国产精品综合久久久| 欧美激情视频一区二区三区在线播放| 欧美日韩一区在线视频| 午夜精品亚洲一区二区三区嫩草| 国产日韩欧美一区二区三区在线观看| 久久精品视频免费播放| 欧美成人在线免费观看| 久久成年人视频| 欧美黑人一区二区三区| 久久gogo国模裸体人体| 欧美国产大片| 女人天堂亚洲aⅴ在线观看| 国产精品久久久久av免费| 亚洲电影免费观看高清完整版 | 激情五月综合色婷婷一区二区| 一片黄亚洲嫩模| 亚洲娇小video精品| 亚洲尤物在线| 亚洲综合欧美日韩| 欧美日韩一级大片网址| 欧美国产成人在线| 国产亚洲视频在线| 亚洲一区国产| 亚洲自拍高清| 欧美性开放视频| 99天天综合性| 日韩视频一区二区三区在线播放| 久久精品99| 久久精品91久久久久久再现| 国产精品久久一级| 在线亚洲欧美视频| 一本一本久久| 欧美日韩一区二区在线| 夜夜爽99久久国产综合精品女不卡 | 亚洲欧美日韩国产综合在线 | 精久久久久久| 久久国产福利| 久久夜色精品国产噜噜av| 国产在线精品成人一区二区三区 | 欧美三级精品| av成人福利| 亚洲欧美国产精品va在线观看| 欧美日韩午夜剧场| 一区二区91| 午夜亚洲性色视频| 国产精品中文字幕欧美| 香蕉久久久久久久av网站| 久久久91精品国产一区二区三区| 国语自产在线不卡| 久久久噜噜噜久久中文字幕色伊伊| 久久综合网hezyo| 亚洲国产日韩一区| 欧美理论视频| 亚洲欧美日韩精品久久久| 久久久综合免费视频| 亚洲国产精品电影| 欧美日韩国产综合新一区| 亚洲一区二区视频| 老司机免费视频久久| 99热在这里有精品免费| 国产精品久久国产愉拍| 欧美一级午夜免费电影| 噜噜噜91成人网| 夜夜爽99久久国产综合精品女不卡 | 日韩系列欧美系列| 国产精品草草| 国产精品欧美一区二区三区奶水| 欧美午夜精品久久久久久久| 国产精品一区二区在线观看不卡| 国产精品一区二区久久久久| 黑人操亚洲美女惩罚| 91久久在线观看| 久久精品道一区二区三区| 一本色道精品久久一区二区三区 | 亚洲人www| 亚洲视频每日更新| 国产日韩av高清| 欧美激情一区二区三级高清视频| 亚洲图片自拍偷拍| 欧美顶级少妇做爰| 欧美在线免费观看亚洲| 亚洲精品日韩综合观看成人91| 欧美视频在线观看一区| 久久久久久久久久久一区 | 亚洲大胆美女视频| 国产精品va在线播放| 久久天天躁狠狠躁夜夜爽蜜月| 日韩手机在线导航| 欧美国产第二页| 久久久www成人免费无遮挡大片| 亚洲美女视频网| 尤物yw午夜国产精品视频明星| 国产精品亚洲视频| 欧美日韩成人| 美女日韩在线中文字幕| 久久动漫亚洲| 亚洲免费在线观看视频| 日韩一二三区视频| 亚洲日本免费| 欧美激情在线狂野欧美精品|