#江西省CCPCゲーム-waves-(DP練習)

江西省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;
}

おすすめ

転載: www.cnblogs.com/sstealer/p/11260057.html