p2702_动态规划.cpp
来自「高手写的所有acm例程 在acm.zju.edu.cn 上的题目的例程」· C++ 代码 · 共 78 行
CPP
78 行
#include <stdio.h>
#include <map>
#include <algorithm>
#define MAXN 4100
using namespace std;
struct TState {
int c [4] , next , max , num;
};
typedef map <int , int> TMap;
int N;
TState State [MAXN];
TMap Map;
bool init ();
void solve ();
main ()
{
while ( init () ) {
solve ();
}
}
void solve ()
{
TMap :: iterator Iter;
State [N].max = 0;
int size , list [2] , k , l;
for ( int i = N - 1; i >= 0; i -- ) {
State [i].max = State [i + 1].max , State [i].next = i + 1;
Map.clear ();
size = 0;
for ( int j = i; j < N; j ++ ) {
Iter = Map.find ( State [j].num );
if ( Iter == Map.end () ) Map [State [j].num] = 0 , Iter = Map.find ( State [j].num );
Iter->second ++;
if ( Iter->second == 4 ) size = 2 , list [0] = list [1] = Iter->first;
if ( Iter->second == 2 ) list [size ++] = Iter->first;
if ( size == 2 ) break;
}
if ( size < 2 ) continue;
for ( k = i , size = 0; size < 2; k ++ )
if ( State [k].num == list [0] ) State [i].c [size ++] = k;
l = k;
k = list [1] == list [0] ? k : i;
for ( ; size < 4; k ++ )
if ( State [k].num == list [1] ) State [i].c [size ++] = k;
if ( k > l ) l = k;
if ( State [l].max + 1 < State [i].max ) continue;
State [i].max = State [l].max + 1;
State [i].next = l;
sort ( State [i].c , State [i].c + 4 );
}
printf ( "%d\n" , State [0].max );
for ( int i = 0; i != N; i = State [i].next ) if ( State [i].next != i + 1 ) {
for ( int j = 0; j < 4; j ++ ) {
if ( j ) printf ( " " );
printf ( "%d" , State [i].c [j] + 1 );
}
printf ( "\n" );
}
printf ( "\n" );
}
bool init ()
{
if ( scanf ( "%d" , &N ) != 1 ) return false;
for ( int i = 0; i < N; i ++ )
scanf ( "%d" , &State [i].num );
return true;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?