• <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中字母的對應關系,看哪種對應需要刪除的字母最少,這一最少值即是答案。
            窮舉對應關系,就是生成全排列。
            我生成全排列的方式是回溯。

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

            // 生成下一字典序排列
            // 假設a中元素互不相同
            // 若已經(jīng)是最后一個字典序排列,則返回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 閱讀(894) 評論(0)  編輯 收藏 引用 所屬分類: ACM 、Algorithm

            久久精品午夜一区二区福利| 久久久久香蕉视频| 久久婷婷国产综合精品 | 韩国三级中文字幕hd久久精品| 久久香蕉一级毛片| 久久久久噜噜噜亚洲熟女综合| 欧美激情精品久久久久久久| 亚洲中文字幕久久精品无码APP | 色综合久久久久无码专区| 亚洲午夜久久久影院伊人| 精品久久久久久成人AV| 久久精品国产精品亚洲人人 | 久久午夜福利无码1000合集| 人妻无码久久一区二区三区免费 | 一本色道久久88综合日韩精品 | 久久精品亚洲AV久久久无码| 久久精品a亚洲国产v高清不卡| 国产69精品久久久久99尤物| 人人妻久久人人澡人人爽人人精品| 99久久人妻无码精品系列| 亚洲精品第一综合99久久| 99精品久久久久久久婷婷| 无码超乳爆乳中文字幕久久| 久久一区二区三区99| 久久综合给合久久狠狠狠97色69| 久久久久久久久久免免费精品| 国产精品免费福利久久| 久久亚洲AV无码精品色午夜| 久久夜色撩人精品国产| 国产精品美女久久久网AV| 久久精品一区二区国产| 久久久精品国产免大香伊| 亚洲精品第一综合99久久 | 成人综合久久精品色婷婷| 7国产欧美日韩综合天堂中文久久久久| 伊人久久大香线蕉综合影院首页| 久久国产免费直播| 久久久久99精品成人片三人毛片| 久久93精品国产91久久综合| 爱做久久久久久| 91精品国产91久久|