PAT甲级1045好きな色ストライプ(30)

エヴァは、与えられた1のうち、自分のカラーストライプを作成しようとしています。彼女は、これらの不要な部分をカットし、彼女の好きな色のストライプを形成するために一緒に残りの部分を縫製によって彼女の好きな順序で唯一の彼女の好きな色を維持したいと思います。

エヴァの好きな色が限られているので、通常の人間の目は、200未満の異なる色について区別できると言われています。しかし、元のストライプは非常に長くなる可能性があり、そしてエヴァは、最大長で残りの好きなストライプを持っていると思います。そこで彼女は彼女に最高の結果を見つけるためにあなたの助けを必要とします。

ソリューションは一意ではないかもしれませんが、あなただけの彼女の最大の長さを指示する必要があることに注意してください。例えば、色のストライプ{2 2 4 1 5 6 3 1 5 6}を与えられました。エヴァの好きな色を{2 3 1 5 6}と彼女の好きな順序で与えられている場合、彼女は、4つの可能な最良の解{2 2 1 1 1 5 6}、{2 2 1 5 5 5 6}、{2 2 1を有しています5 5 6 6}、および{2 2 3 1 5 6}。

入力仕様:

各入力ファイルには、1つのテストケースが含まれています。各場合について、最初の行には関与色の総数である(したがって、色は1からNまで番号が付けられている)N(≤200)整数陽性を含んでいます。そして、M(≤200)整数正で次の行を開始するには、彼女のお気に入りのために与えられたMエヴァの好きな色番号が続きます。最後に第三のラインは、ストライプ上のL色続く所与のストライプの長さである正の整数L(^ 4≤10)、始まります。線aのすべての数字は、スペースで区切られています。

出力仕様:

各テストケースのために、単にラインでエヴァのお気に入りのストライプの最大長を印刷します。

サンプル入力:

6
5 2 3 1 5 6
12 2 2 4 1 5 5 6 3 1 1 5 6

サンプル出力:

7

分析の
問題への解決策を見た後に行うには、LISを発見されました。
最初に私は真剣に速いLISよりも、正確な行い、DP 2つの配列に直接質問を見ていませんでした。

#include <bits/stdc++.h>
using namespace std;

const int maxn = 10010;

int f[maxn][210];
int ss, m, l;  // m < l
int s[maxn], t[maxn];
int main()
{
    cin >> ss >> m;
    for (int i = 1; i <= m; i++)
        cin >> s[i];
    cin >> l;
    for (int i = 1; i <= l; i++)
        cin >> t[i];

    for (int i = 1; i <= m; i++)
    {
        for (int j = 1; j <= l; j++)
        {
            f[j][i] = max(f[j - 1][i], f[j][i-1]);
            if (t[j] == s[i]) f[j][i] += 1;
        }
    }
    cout << f[l][m] << endl;
    return 0;
}
发布了673 篇原创文章 · 获赞 644 · 访问量 38万+

おすすめ

転載: blog.csdn.net/zhaohaibo_/article/details/90489231