zoukankan      html  css  js  c++  java
  • hdu 1503 LCS输出路径【dp】

    hdu 1503

      不知道最后怎么输出,因为公共部分只输出一次。有人说回溯输出,感觉好巧妙!其实就是下图,输出的就是那条灰色的路径,但是初始时边界一定要初始化一下,因为最第一列只能向上走,第一行只能向左走。我用1表示向上走,2向左上方走,3向左走。

      刚开始输入字符串时有两种方法,直接输入;或从地址后一位输入,即此时数组起始编号为1。直接输入时,dp[i][j]表示的是以s1[i-1],s2[j-1]为结尾LCS,另一种则就是表示以s1[i],s2[j]为结尾的LCS。两者在路径输出时有些差别,以前感觉直接输出LCS长度后者方便,其实都一样。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 using namespace std;
     6 const int MAXN = 107;
     7 char s1[MAXN], s2[MAXN];
     8 int dp[MAXN][MAXN], flag[MAXN][MAXN];
     9 int len1, len2;
    10 
    11 void LCS()
    12 {
    13     memset(dp, 0, sizeof(dp));
    14     for (int i = 0; i <= len1; i++) flag[i][0] = 1;
    15     for (int i = 0; i <= len2; i++) flag[0][i] = 3;
    16     for (int i = 1; i <= len1; i++) {
    17         for (int j = 1; j <= len2; j++) {
    18             if (s1[i - 1] == s2[j - 1]) {
    19                 dp[i][j] = dp[i - 1][j - 1] + 1;
    20                 flag[i][j] = 2;
    21             }
    22             else if (dp[i - 1][j] >= dp[i][j - 1]) {
    23                 dp[i][j] = dp[i - 1][j];
    24                 flag[i][j] = 1;
    25             }
    26             else {
    27                 dp[i][j] = dp[i][j - 1], flag[i][j] = 3;
    28             }
    29         }
    30     }
    31 }
    32 
    33 void Print(int x, int y)
    34 {
    35     if (x == 0 && y == 0) return;
    36     if (flag[x][y] == 2) {
    37         Print(x - 1, y - 1);
    38         cout << s1[x-1];
    39     }
    40     else if (flag[x][y] == 1) {
    41         Print(x - 1, y);
    42         cout << s1[x - 1];
    43     }
    44     else {
    45         Print(x, y - 1);
    46         cout << s2[y - 1];
    47     }
    48 }
    49 
    50 int main()
    51 {
    52     while (cin>>s1>>s2)
    53     {
    54         len1 = strlen(s1), len2 = strlen(s2);
    55         LCS();
    56         Print(len1, len2);
    57         cout << endl;
    58     }
    59     return 0;
    60 }

    起始编号为1:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 using namespace std;
     5 const int MAXN = 107;
     6 int dp[MAXN][MAXN], flag[MAXN][MAXN];
     7 char s1[MAXN], s2[MAXN];
     8 int len1, len2;
     9 
    10 void LCS()
    11 {
    12     for (int i = 0; i <= len1; i++) flag[i][0] = 1;
    13     for(int i = 0; i <= len2; i++) flag[0][i] = 3;
    14     for (int i = 1; i <= len1; i++) {
    15         for (int j = 1; j <= len2; j++) {
    16             if (s1[i] == s2[j])
    17                 dp[i][j] = dp[i - 1][j - 1] + 1, flag[i][j] = 2;
    18             else if (dp[i - 1][j] >= dp[i][j - 1])
    19                 dp[i][j] = dp[i - 1][j], flag[i][j] = 1;
    20             else dp[i][j] = dp[i][j - 1], flag[i][j] = 3;
    21         }
    22     }
    23 }
    24 
    25 void Print(int x, int y)
    26 {
    27     if (x == 0 && y == 0) return;
    28     if (flag[x][y] == 2) {
    29         Print(x - 1, y - 1);
    30         printf("%c", s1[x]);
    31     }
    32     else if (flag[x][y] == 1) {
    33         Print(x - 1, y);
    34         printf("%c", s1[x]);
    35     }
    36     else {
    37         Print(x, y - 1);
    38         printf("%c", s2[y]);
    39     }
    40     return;
    41 }
    42 
    43 int main()
    44 {
    45     while (scanf("%s %s", s1 + 1, s2 + 1)==2)
    46     {
    47         len1 = strlen(s1 + 1), len2 = strlen(s2 + 1);
    48         memset(dp, 0, sizeof(dp));
    49         LCS();
    50         Print(len1, len2);
    51         printf("
    ");
    52     }
    53     return 0;
    54 }
  • 相关阅读:
    QT多重继承的时候,要把QObject放在最前面,否则报错——C++认为人性本恶,默认都是私有的,这点和Delphi的世界观不一样
    动态库的搜索路径
    载入OpenSSL的动态库——学会使用tryToLoadOpenSslWin32Library和QPair
    Physical Standby Database Failover
    ARM和X86功耗差别的深层原因探讨
    Qt 鼠标样式特效探索样例(一)——利用时间器调用QWidget.move()函数
    QT---线程间通信
    Qt :非window子窗体的透明度设置
    QT:给Widget设置背景图片——设置Widget的调色板,调色板使用图片和背景色
    用友CDM系统,将货位间商品移库单(一步)修改为内调出入库单(一步)方法使用
  • 原文地址:https://www.cnblogs.com/zxhyxiao/p/7436606.html
Copyright © 2011-2022 走看看