Uva 10066 The Twin Towers (DP_最长公共子序列)

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=114&page=show_problem&problem=1007


题目大意给定组成两个塔的n个砖头高度以及m个砖头高度,求高度一样并且最长的子序列。


解题思路:写到不爱写了,又是经典的最长公共子序列模型。状态转移方程见前面的统一模型文章。


测试数据:

7 6
20 15 10 15 25 20 15

15 25 10 20 15 20


8 9
10 20 20 10 20 10 20 10
20 10 20 10 10 20 10 10 20


代码:
#include <stdio.h>
#include <string.h>
#define MAX 110
#define max(a,b) (a)>(b)?(a):(b)


int n,m,dp[MAX][MAX];
int arr[MAX],brr[MAX];


int main()
{
    int i,j,k,maxx,cas = 0;


    while (scanf("%d%d",&n,&m),n+m){

        for (i = 1; i <= n; ++i)
            scanf("%d",&arr[i]);
        for (j = 1; j <= m; ++j)
            scanf("%d",&brr[j]);

        
        maxx = -1;
        memset(dp,-1,sizeof(dp));
        for (i = 0; i < n; ++i)
            dp[i][0] = 0;
        for (i = 0; i < m; ++i)
            dp[0][i] = 0;
        for (i = 1; i <= n; ++i)
            for (j = 1; j <= m; ++j) {

                if (arr[i] == brr[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]);
                if (dp[i][j] > maxx) maxx = dp[i][j];
            }


        printf("Twin Towers #%d\nNumber of Tiles : %d\n\n",++cas,maxx);
    }
}


本文ZeroClock原创,但可以转载,因为我们是兄弟。

你可能感兴趣的:(测试)