您的位置:首页 > 编程语言 > PHP开发

UVA 10066 - The Twin Towers

2011-05-13 16:56 429 查看
题目大意:讲了一大堆,就是要求 最长公共子序列。

题目类型: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
[m]<<endl<<endl;
}
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  output n2 each