uvaoj111
来源:互联网 发布:ubuntu命令行支持中文 编辑:程序博客网 时间:2024/06/05 21:06
uvaoj111
题意: 求公共最长子串
注意: 题中的意思
4
4 3 2 1 ( 事件一发生的位置在第四位,事件二发生的位置在第3位 。。。)
所以重新设置顺序后就可以直接求公共子串了
详解来自:http://www.cnblogs.com/zpfbuaa/p/5049124.html
#include<stdio.h>#include<string.h>#define max(a,b) a>b?a:bint s1[30],s2[30];int dp[30][30];int n;int dp_2( ){memset(dp,0,sizeof(dp));int i,j;for( i = 1;i<=n;i++){for(j = 1;j <= n;j++){if(s1[i] == s2[j]){dp[i][j] = max(dp[i][j] , dp[i-1][j-1] + 1);}else{dp[i][j] = max(dp[i-1][j] ,dp[i][j-1]);}}} return dp[n][n];}int main(){ int i,a; scanf("%d",&n);for(i = 1;i<= n;i++){scanf("%d",&a);s1[a] = i;}i = 1;while(scanf("%d",&a)!=EOF){s2[a] =i++;if( i == n+1){i = 1;printf("%d\n",dp_2());}} return 0;}
0 0