Uva 111-History Grading(DP/LCS)

来源:互联网 发布:2部电梯 调度算法 编辑:程序博客网 时间:2024/06/05 04:26

题目链接:点击打开链接

题意坑。。 本来一看就是就裸LCS ,但题目中给的输入并不是原序列,而是原序列,而是原序列的位置。。比如 3 1 2 并不是 s[1]=3 而是1在序列中位置是3 即 s[3]=1; (s[x]=i;)

然后输入处理一下就裸LCS。

#include <algorithm>#include <iostream>#include <cstring>#include <cstdlib>#include <string>#include <cctype>#include <vector>#include <cstdio>#include <cmath>#include <queue>#include <stack>#include <map>#include <set>#define maxn 1<<12#define _ll __int64#define ll long long#define INF 0x3f3f3f3f#define Mod 1000000007#define pp pair<int,int>#define ull unsigned long longusing namespace std;short dp[22][22];int s[22],t[22],n;void solve(){memset(dp,0,sizeof(dp));for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(s[i]==t[j])dp[i][j]=dp[i-1][j-1]+1;elsedp[i][j]=max(dp[i][j-1],dp[i-1][j]);printf("%d\n",dp[n][n]);}int main(){int x;while(~scanf("%d",&n)){for(int i=1;i<=n;i++){scanf("%d",&x);s[x]=i;}while(~scanf("%d",&x)){t[x]=1;for(int i=2;i<=n;i++){scanf("%d",&x);t[x]=i;}solve();}}    return 0;}

0 0
原创粉丝点击