• <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>

            coreBugZJ

            此 blog 已棄。

            生成全排列的非回溯方法(TopCoder SRM 591 DIV 2)

            問題來自 TopCoder SRM 591 DIV 2 的第二題:

            Problem Statement
               
            Let X and Y be two strings of equal length, consisting of uppercase English letters only. The two strings are called convertible if there is a permutation P of the English alphabet with the following property: if each character c in the string X is replaced by the character P(c), we obtain the string Y. (In other words, X and Y are convertible iff the following holds: whenever two letters of X are equal, the corresponding two letters of Y must be equal, and vice versa.)  For example, consider the string "ABCA". We can choose to replace each 'A' by a 'F', each 'B' by a 'B', and each 'C' by a 'G', obtaining the string "FBGF". Thus the strings "ABCA" and "FBGF" are convertible. The strings "ABCA" and "EFGH" are not convertible, because the two 'A's in the first string must correspond to the same letter in the second string. The strings "ABCA" and "EEEE" are not convertible, because different letters in the first string must correspond to different letters in the second string.  You are given two strings A and B of the same length. These strings only contain English letters from 'A' to 'I', inclusive. (That is, only the first 9 letters of the alphabet are used.)  You want to change A and B into two strings that are convertible. The only allowed change is to choose some indices (possibly none) and to remove the characters at those indices from each of the strings. (I.e., the removed characters must be at the same positions in both strings. For example, it is not allowed to only remove character 0 of A and character 3 of B.) For example, if A="ABAC", B="AHHA" and the chosen indices are 0 and 2, then the resulting strings will be "BC" and "HA". Our goal is to choose as few indices as possible, given that after the erasing we want to obtain two convertible strings. Compute and return the smallest possible number of chosen indices.
            Definition
               
            Class:
            ConvertibleStrings
            Method:
            leastRemovals
            Parameters:
            string, string
            Returns:
            int
            Method signature:
            int leastRemovals(string A, string B)
            (be sure your method is public)
               

            Constraints
            -
            A will contain between 1 and 50 characters, inclusive.
            -
            A and B will be of the same length.
            -
            A will contain characters from 'A' to 'I' only.
            -
            B will contain characters from 'A' to 'I' only.

            我的思路是窮舉A中字母與B中字母的對(duì)應(yīng)關(guān)系,看哪種對(duì)應(yīng)需要?jiǎng)h除的字母最少,這一最少值即是答案。
            窮舉對(duì)應(yīng)關(guān)系,就是生成全排列。
            我生成全排列的方式是回溯。

            之后看其他人的代碼,發(fā)現(xiàn)一個(gè)由給定排列求出其下一個(gè)排列的函數(shù),于是學(xué)習(xí)一下,自己實(shí)現(xiàn)如下:

            // 生成下一字典序排列
            // 假設(shè)a中元素互不相同
            // 若已經(jīng)是最后一個(gè)字典序排列,則返回0,否則返回1
            int next_permutation( int a[], int n ) {
                    
            int i, j;
                    
            for ( i = n-1; (0 < i) && (a[i-1> a[i]); --i ) {
                    }
                    
            if ( 0 >= i ) {
                            
            return 0;
                    }
                    
            for ( j = n-1; j >= i; --j ) {
                            
            if ( a[ j ] > a[ i-1 ] ) {
                                    
            int tmp = a[ i-1 ];
                                    a[ i
            -1 ] = a[ j ];
                                    a[ j ] 
            = tmp;
                                    j 
            = n - 1;
                                    
            while ( i < j ) {
                                            tmp 
            = a[ i ];
                                            a[ i ] 
            = a[ j ];
                                            a[ j ] 
            = tmp;
                                            
            ++i; --j;
                                    }
                                    
            break;
                            }
                    }
                    
            return 1;
            }

            還有人使用的是C++的 <algorithm> 中 next_permutation 函數(shù),功能一樣。


            posted on 2013-09-28 17:03 coreBugZJ 閱讀(910) 評(píng)論(0)  編輯 收藏 引用 所屬分類: ACMAlgorithm

            久久精品视频网| 国产精品久久久久久久久久免费| 伊人久久亚洲综合影院| 久久久这里有精品| 性欧美大战久久久久久久久| 久久国产乱子伦精品免费强| 久久本道伊人久久| 模特私拍国产精品久久| 久久精品国产亚洲AV香蕉| 狠狠综合久久综合中文88| 久久久久波多野结衣高潮| 久久国产精品久久精品国产| 亚洲七七久久精品中文国产| 成人久久综合网| 久久天天躁夜夜躁狠狠| .精品久久久麻豆国产精品| 久久综合鬼色88久久精品综合自在自线噜噜 | 久久久WWW成人免费毛片| 狠狠精品久久久无码中文字幕| 国内精品久久国产大陆| 无码人妻久久一区二区三区蜜桃| 久久国产精品成人影院| 久久精品国产亚洲AV影院| 国产亚洲综合久久系列| 久久婷婷五月综合国产尤物app| 久久91精品国产91久久小草| 国产精品久久久久久久人人看| 国产高潮国产高潮久久久91 | 午夜精品久久久久久久久| 日本精品一区二区久久久| 婷婷综合久久中文字幕| 国产Av激情久久无码天堂| 久久亚洲AV成人无码电影| 久久这里只有精品首页| 一本色道久久88综合日韩精品 | 久久综合狠狠综合久久97色| 久久国产精品99精品国产987| 久久综合狠狠综合久久综合88| 久久香综合精品久久伊人| 亚洲人成无码www久久久| 中文字幕久久亚洲一区|