hdu 2476 - String Printer


http://acm.hdu.edu.cn/showproblem.php?pid=2476
There are two strings A and B with equal length. Both strings are made up of lower case letters. Now you have a powerful string painter. With the help of the painter, you can change a segment of characters of a string to any other character you want. That is, after using the painter, the segment is made up of only one kind of character. Now your task is to change A to B using string painter. What’s the minimum number of operations?
 

Input
Input contains multiple cases. Each case consists of two lines:
The first line contains string A.
The second line contains string B.
The length of both strings will not be greater than 100.
 

Output
A single line contains one integer representing the answer.
 

Sample Input
zzzzzfzzzzz abcdefedcba abababababab cdcdcdcdcdcd
 

Sample Output
6 7
https://blog.csdn.net/wiking__acm/article/details/8362562
首先突破的是,想出这道题是区间的动态规划。
区间的动态规划,可以按区间长度循环,从小到大
然后想出,每次刷的区间,肯定不是相交的关系,要么包含,要么相离
接着看出,对每个区间,首尾字母(在目标串中的)一定是相同的,否则这个区间包含最后那个字母是没有意义的
但是,接下来问题就来了,因为每次刷了一个区间后,在求这个被刷区间内的小区间时,原来的dp值已经无效了
因为这时不是从初始串变到目标串,而是从被刷后的串变到目标串。
这样难道要再加一维状态记录当前串是哪些字母吗?可是这样感觉做不下去了
这里实在想不下去了,搜了解题报告后发现一种思路:
先不管初始串,把题目改为按照原来的规则,直接构造一个目标串,问最少需要几步?
这样,之前卡住的不断变化的串就不用考虑了,因为我不考虑当前串是什么,只考虑哪一部分已经匹配目标串
于是,用dp[i][j]记录从把i~j区间的空串变化到目标串,
初始化方程:dp[i][j] = dp[i+1][j] + (t[i]==t[j]?0:1);
//0的意思是,i不用考虑了,因为可以在刷j时“顺便”把它刷了,注意
//if(t[i] == t[j])  dp[i][j] = dp[i+1][j-1]+1是不对的,这样答案是偏大的
变化方程:if(t[i] == t[k])                      dp[i][j] = min(dp[i][j],dp[i+1][k]+dp[k+1][j]);
这样有了dp值后,再来求这个题目的ans,ans[i]代表0~i初始串变到目标串所需的最少步数
对ans[i],枚举出所有的情况即可

int dp[105][105];
int ans[105];
int main(){
    char s[105],t[105];

    while(scanf("%s%s",s,t) != EOF){
        int n = strlen(s);
        for(int k = 1;k <= n;k++){
            for(int i = 0;i < n-k+1;i++){
                if(k == 1)  dp[i][i+k-1] = 1;
                else dp[i][i+k-1] = dp[i+1][i+k-1] + (t[i]==t[i+k-1]?0:1);
                for(int j = i+1;j < i+k-1;j++){
                    if(t[i] == t[j])
                        dp[i][i+k-1] = min(dp[i][i+k-1],dp[i+1][j]+dp[j+1][i+k-1]);
                }
            }
        }
        for(int i = 0;i < n;i++){
            ans[i] = dp[0][i];
            if(s[i] == t[i])    ans[i] = ans[i-1];
            for(int j = 0;j < i;j++){
                ans[i] = min(ans[i],ans[j]+dp[j+1][i]);
            }
        }
        cout << ans[n-1] << endl;
    }
    return 0;
}


http://www.voidcn.com/article/p-vrrlyuoa-bmr.html
题意:两个字符串,操作:选取一段变为相同的字符,求有a串变为b串最小的操作次数
先考虑从空串变为b串需要的最少操作次数
dp[i] [j]表示i到j段变成b串需要的最少操作次数
dp[i] [j] = min( dp[i+1] [k] + dp[k+1] [j])(其中k满足b[k]==b[i])因为对于i+1到k段,无论要求把串变成什么样,我始终可以第一次把他全变为b【k】边界这个字符,这样就可以把b[i]也改变。(区间dp实现)
在考虑将a串变为b串的最小操作次数,当a[i]==b[i]时这个点是不需要在改的(ans[i]=ans[i-1]),而前面也可能存在这种不需要改的点


所以ans[i]=min( ans[k] + dp[k+1][i] )(k<i)
    int i,j,k;
    while(cin>>a>>b)
    {
        memset(ans,0,sizeof(ans));
        memset(dp,0,sizeof(dp));
        for(i=0;i<a.size();i++)
        dp[i][i]=1;

        for(i=1;i<a.size();i++)
        {
            for(j=0;j+i<a.size();j++)
            {
                dp[j][j+i]=dp[j+1][j+i]+1;
                for(k=j+1;k<=j+i;k++)
                {
                    if(b[k]==b[j])
                    dp[j][j+i]=min(dp[j][j+i],dp[j+1][k]+(k==j+i?0:dp[k+1][j+i]));
                }
            }
        }
        for(i=0;i<a.size();i++)
        {
            if(a[i]==b[i])
                ans[i]=min(dp[0][i],i?ans[i-1]:0);
            else
                ans[i]=dp[0][i];
            for(j=0;j<i;j++)
                ans[i]=min(ans[i],ans[j]+dp[j+1][i]);
        }
        cout<<ans[a.size()-1]<<endl;
    }

思路是先求出从空白串转化到b串要花多少次
然后比较a串和b串相同元素的个数在优化答案



Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts