固定テンプレート
パスを記録しないでください
#include <bits/stdc++.h>
using namespace std;
const int N = 100;
int A[N], dp[N];
//以A[i]为结尾的最长不下降子序列
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> A[i];
}
int ans = -1;
for(int i = 1; i <= n; i++)
{
dp[i] = 1; //假定最长子序列是自己
for(int j = 1; j < i; j++) //判断要不要将i加进去 如果A[i]比A[j]高那肯定要加进去
{
if(A[i] >= A[j] && dp[i] < dp[j] + 1)
{
dp[i] = dp[j] + 1;
}
}
ans = max(dp[i], ans);
}
cout << ans;
return 0;
}
回答
この質問は実際にテンプレートのA[i] >= A[j]
判断基準を変更しています。この質問は、お気に入りの色の順序を数値でマッピングできます。初めてマップタイムアウトを使用したときは、正直にハッシュテーブルを使用し、残りはテンプレートです。
注:
- 質問が6ではなく、好きな色が5であることを明確に確認し、5を入力します
- 気に入らない色を蹴り出し、状態遷移方程式を使用する必要があります。そうしないと、最初の色がお気に入りでない場合、カウントされる可能性があります。
ACコード:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 10010;
int hashTable[maxn];
int A[maxn], dp[maxn];
int main()
{
int n, m, l, x, k;
cin >> n >> m; //n没用
fill(hashTable, hashTable + maxn, -1);
for(int i = 1; i <= m; i++)
{
cin >> x;
hashTable[x] = i;
}
cin >> l;
int num = 1;
for(int i = 1; i <= l; i++)
{
cin >> x;
if(hashTable[x] != -1)
{
A[num++] = x;
}
}
int ans = -1;
for(int i = 1; i < num; i++)
{
dp[i] = 1;
for(int j = 1; j < i; j++) //不等于就是在做要不要i这个选择
{
if(hashTable[A[i]] >= hashTable[A[j]] && dp[i] < dp[j] + 1) //如果满足这个条件那就要把A[i]加到A[j]后边
{
dp[i] = dp[j] + 1;
}
}
ans = max(ans, dp[i]);
}
cout << ans;
return 0;
}