タイトルのテキスト:
アヴィンはシリーズを検討しています。以下の条件が満たされた場合、一連の「波」と呼ばれています。
- これは、少なくとも2つの要素を含んでいます。
- 奇数の位置のすべての要素は同じです。
- でも位置でのすべての要素は同じです。
- 奇数の位置の要素がさえ位置にある要素と同じではありません。
あなたは長さnのシリーズを与えられています。アヴィンは最長の「波」サブシリーズを見つけることが求められます。サブシリーズは、シリーズのサブシーケンスです。
入力
最初の行は二つの数字N、C(1≤N≤100、000、1≤C≤100)を含みます。2行目は、その範囲は[1、C]、シリーズを表すn個の整数を含みます。常に「波」サブシリーズがあることが保証されています。
出力
最長の「波」サブシリーズの長さを出力します。
サンプル入力
5 3
1 2 1 3 2
サンプル出力
4
問題の意味
最長シーケンスを見つける条件所与の配列を満たし得、配列は2つの要素の添え字は同じ要素である全ての偶数ビットの最小値を必要とし、奇数のインデックス・ビット上のすべての要素が同じです。
感想
私はそのDPを知っていたが、私にもあるし、私は数日を望んでいたし、最終的にすべての後に、Aのアイデアを思い付いた、または仕事に能力の欠如難しく、再び偉大な神の考えを理解していない問題の解決策を見つけるためにインターネットの後に、アイデアを見つけることができませんでした。
思考
1:DPのタイトルは、開始点は、問題の初期状態で、時間の明らかに2つの要素だけの問題を解決するための初期状態は(要素のための条件を満たしていないが)、これは(1、2)に設定されています
2:第3の数bは新規の数であり、次いで、B前面(1,2)より長い配列、(1、B)を構成する2つだけの新たなサブ配列、および(2、B)を構成することができると仮定
3:Bの数が1である場合、(1,2,1)= DP(1,2 DP与えること、(2)延長することができる )+ 1。配列が繰り返されるので、2つのQiuzi要素が常に裏返し、したがって、状態遷移方程式派生する必要があります
。DP(A、B)= DP(B、A)+ 1
コード
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int dp[110][110];
int book[110];
int main(){
int n, c;
while(scanf("%d%d", &n, &c) == 2){
memset(dp, -1, sizeof(dp));
memset(book, 0, sizeof(book));
int num, len = 0;
for(int i = 0; i < n; i++){
scanf("%d", &num);
book[num] = 1;//记录前面出现过的数
for(int j = 1; j <= 100; j++){
if(j == num || book[j] == 0) continue;
if(dp[num][j] == -1)//前面没有翻转的子序列
dp[j][num] = 2;//初始化为2
else
dp[j][num] = dp[num][j] + 1;
len = max(len, dp[j][num]);
}
}
printf("%d\n", len);
}
}