UVA 10066 - The Twin Towers

题目大意:讲了一大堆,就是要求 最长公共子序列。

题目类型:dp / LCS

题目分析:

是我没睡醒吗?为什么明明写的是//Print a blank line after the output of each data set. 而不是每组数据间一个blankline。竟然调了许久。

 代码:

① 记忆化搜索版本。

//那么大段题目,其实讲的就是最长公共子序列。fuck。 #include<cstdio> #include<cstring> using namespace std; int n1, n2; #define MAXN 102 int d[MAXN][MAXN]; int vis[MAXN][MAXN]; int a[MAXN], b[MAXN]; int dp(int i, int j) { if(i < 0 || j < 0) { return 0; } if(vis[i][j]) return d[i][j]; vis[i][j] = 1; int max; if(a[i] == b[j]) max = dp(i-1, j-1)+1; else { max = dp(i, j-1)>dp(i-1, j)? dp(i, j-1): dp(i-1, j); } return d[i][j] = max; } inline int Rint() {int x; scanf("%d", &x); return x;} int main() { int T=1; while(1) //当至少有一个不为0 { n1 = Rint(); n2 = Rint(); if(!n1 && !n2) break; // if(T!=1) printf("/n"); memset(vis, 0, sizeof(vis)); for(int i=0; i<n1; i++) a[i] = Rint(); for(int i=0; i<n2; i++) b[i] = Rint(); int ans = dp(n1-1, n2-1); printf("Twin Towers #%d/n", T++); printf("Number of Tiles : %d/n", ans); printf("/n"); //Print a blank line after the output of each data set. } }

来自zcoder, http://www.zhaocong89.com/?p=498

递推解状态转移方程版本。

#include<iostream> #include<fstream> #include<cstring> #include<cstdlib> using namespace std; #ifndef ONLINE_JUDGE ifstream fin("test.in"); ofstream fout("test.out"); #else #define fin cin #define fout cout #endif const int maxn = 105; int n,m; int t1[maxn]; int t2[maxn]; int d[maxn][maxn]; int main() { int ncase = 0; while(fin>>n>>m&&(!(n==0&&m==0))) { // if(ncase) // fout<<endl; memset(d,0,sizeof(d)); for(int i=1;i<=n;i++) fin>>t1[i]; for(int i=1;i<=m;i++) fin>>t2[i]; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(t1[i]==t2[j]) d[i][j]=d[i-1][j-1]+1; else d[i][j]=max(d[i-1][j],d[i][j-1]); } } fout<<"Twin Towers #"<<(++ncase)<<endl; fout<<"Number of Tiles : "<<d[n][m]<<endl<<endl; } return 0; }

 

你可能感兴趣的:(each,n2,output)