江西省CCPCゲーム-waves-(DP練習)
タイトルのチェーン:http://acm.hdu.edu.cn/showproblem.php?pid=6570
質問が意図される:偶数ビット、最長シーケンス番号が同一の奇数番目のビットである満たすために求めて、あなた1≤c≤100のアレイ1≤N≤100000、前記要素[1、C]をNの長さを与えるために番号も同じですが、パリティの違いは、あなたのシーケンスの長さを求めたと。
溶液1:C、狭い範囲が、これらの特性から明らかであり、配列は2つだけの数字で構成され、二つの数は、cの範囲内を挙げることができます。最初に表示される各番号の位置を保存します。
AcCode:
#include <bits/stdc++.h>
using namespace std;
#define fre freopen("C:\\Users\\22765\\Desktop\\in.txt","r",stdin);
#define ms(a) memset((a),0,sizeof(a))
#define re(i,a,b) for(int (i)=(a);(i)<(b);(i)++)
#define sf(x) scanf("%d",&(x))
#define rg register
#define il inline
typedef long long LL;
const int inf=(0x7f7f7f7f);
const int maxn=3000;
vector<int> v[105];
int main(){
int n,c;
sf(n);sf(c);
int x;
re(i,0,n){
sf(x);
v[x].push_back(i);
}
int res=0,len;
int p,q,fir,sec;
bool f;
re(i,1,c+1){
if(v[i].size()==0)continue;
re(j,1,c+1){
if(i==j)continue;
p=q=0;len=0;
fir=sec=-1;f=1;
while(p<v[i].size()&&q<v[j].size()){
if(f){
while(p<v[i].size()&&v[i][p]<sec)p++;
if(p<v[i].size()){
fir=v[i][p],len++,f=0;
}
}
else {
while(q<v[j].size()&&v[j][q]<fir)q++;
if(q<v[j].size()){
len++,sec=v[j][q],f=1;
}
}
}
res=max(res,len) ;
}
}
printf("%d\n",res) ;
return 0;
}
- 解決方法2:\(DPは、[I] [J] \)終了Iを表し、かつての数がj個の配列の長さ、\(DP [I] [I] = 0 \)、\ (I \) \(! = J \)場合、\(DP [I] [J] DP = [J] [I] + +1 \)の各位置について、前処理の現在の数を終了し、番号がされる前に、[(\ 1、C ] \)すべての11例、任意の数に。
AcCode:
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
#define re(i,a,b) for(int (i)=(a);(i)<(b);++(i))
const int maxn = 1e5 + 5;
int num[maxn];
int dp[105][105];
int main()
{
std::ios::sync_with_stdio(false);
int n, c;
cin >> n >> c;
int i;
re(i, 0, n)
{
cin >> num[i];
}
int ans = 1;
re(i, 0, c + 1){
//初始化,对于数组第一个数字num[0]来说只要$i!=j那么$dp[i][j]=1$
//这里为什么是1而不是2,因为可以确定的数只有dp数组的前一个参数,
//第二个参数是不确定的
if (num[0] == i)
dp[num[0]][i] = 0;
else
dp[num[0]][i] = 1;
}
re(i, 1, n)
{
int j;
re(j, 0, c + 1)//对原序列的每一个位置,预处理第二个参数的所有情况
{
if (num[i] == j)
dp[num[i]][j] = 0;
else
dp[num[i]][j] = dp[j][num[i]] + 1;//状态转移
ans = max(ans, dp[num[i]][j]);//记录答案
}
}
cout << ans << endl;
return 0;
}