HOJ 1447 Compromise (DP)

来源:互联网 发布:磁力链接在线播放软件 编辑:程序博客网 时间:2024/04/27 23:35

是一道要记录公共子序列内容的DP。

状态转移方程部分:

for(int i=1; i<=len1; i++)        {            for(int j=1; j<=len2; j++)            {                if(!strcmp(str1[i],str2[j]))                {                    f[i][j]=f[i-1][j-1]+1;                }                else                {                    f[i][j]=max(f[i-1][j],f[i][j-1]);                }            }        }


前半部分先是正常的DP,输出时要倒过来进行判断。

  

 int i=len1;       int j=len2;       int k=0;       while (i >= 1 && j >=1)       {           if ((f[i][j] == f[i-1][j-1] +1)&&(f[i][j] != f[i-1][j])&&(f[i][j] != f[i][j-1]))           {               strcpy(record[k++],str1[i]);               i--;               j--;           }           else if (f[i][j] == f[i-1][j]) i--;           else if (f[i][j] == f[i][j-1])j--;       }       k--;       while(k>=1)           //输出的时候一定要小心~!~!~!注意空格,回车       {           printf("%s ",record[k]);           k--;       }

通过if判断出每一个状态f[i][j]是从哪一个状态转移过来的,如果是从f[i-1][j-1]转移过来的话,则说明这里str1[i]==str2[j],是公共的。用一个二维字符数组记录下这一公共的字符串。

最后,再将record倒序输出。

这题被卡了很久主要是输出时的空格和换行没处理好。貌似是在最后一个单词后面多输出了一个空格。。要细心啊~

原创粉丝点击