USACO 5.1.3 Musical Theme ( 最长重复子序列)

USACO 5.1.3 Musical Theme ( 最长重复子序列)
将相邻的数做差之后,转换为求最长重复子序列。

/**/ /*
ID: lorelei
TASK: theme
LANG: C++
*/


#include 
< fstream >

using   namespace  std;

const   int  MAXN  =   5005 ;
const   int  INF  =   0x7FFFFFFF ;

ifstream fin(
" theme.in " );
ofstream fout(
" theme.out " );

int  a[MAXN];
int  n, ans;

void  input() {
    
int p,q;
    fin
>>n>>p;
    
for(int i=1; i<n; ++i){
        fin
>>q;
        a[i]
=q-p;
        p
=q;
    }

}


void  solve() {
    
for(int i=1; i<n-ans; ++i)
        
for(int j=i+ans; j<n-ans; ++j)
            
if(a[i]==a[j]){
                
int len=1, k=j;
                
while(a[i+len] == a[j+len] && i+len+1<k) len++;
                
if(len>ans)
                    ans
=len;
            }

}


void  output() {

    
if(ans<4) ans = -1;
    fout
<<ans+1<<endl;
}


int  main() {

    input();

    solve();

    output();

    
return 0;
}

你可能感兴趣的:(USACO 5.1.3 Musical Theme ( 最长重复子序列))