LianliankanのHDU - 4272のような圧力DP

問題の意味:スタックのN(N <= 1000)の長さは、上部要素は、1〜5以下、Qが最終的に完全に除去することができるで同じ数の要素に除去することができます。

 

ソリューション:

このシーケンス例
1
2
3
4
5
6
7
8
9
10
11
この位置で最も遠い位置2は11に適合させることができる
のはなぜ?
この位置は、6、3、4に1を一致させることができるので、それは(私は、十分な確かにシーケンスを書いたことがあろう)これらの場所があまりにも一致の上である可能性が高いと言うことです
その後、残りの配列はなりなった
2
。7
8
9
10
11
2と一致遠い距離11となるよう
我々は唯一のオーバー位置オフセット聖歌の数かどうかを確認する必要がありますので、状態に少なくとも9つの位置を保存する必要がないので、
何もオフセットされている私たちは、この位置の番号1を使用できるようにオフセットされた0で、
当時と9つの州を置きますバイナリ形式として、その後デジタルINTサイズに圧縮
したがって、開始状態は、DP [0] [0] =で 1
DPなら[I] [j]の値位置をオフセットされたスタック番号の先頭からI-1を表すオフセットされない表す1、0を表しますオフセット
DP [0] [0]のみ、以下のプログラムを実行するように設定されています
割り当ての] [[i]は、私たちのそれぞれがDPするので、title要素は、スタックの最上位を相殺することを保証するために、すべての最初の時間を確認する必要がありますので、DP [I-1] [ ] 位置の値は
、コードの特定の外観
 
 
コード:
1の#include <stdio.hの>
 2の#include < ストリング・H>
 3の#include <iostreamの>
 4の#include <アルゴリズム>
 5のtypedef 長い LL。
6  使用して 名前空間はstdを、
7  CONST  INT MAXN = 1005 8  CONST  INT M = 1 << 9 9  INT V [MAXN]、DP [MAXN] [ 1 << 9 ]。
10  のint main()の
 11  {
 12      INT N。
13      一方(〜のscanf(" %d個"、&N))
 14      {
 15          のmemset(DP、0はsizeof (DP))。
16          のためにINT ; I> I = N 0 ; - i)が
 17              のscanf(" %dの"、&V [I])。
18          DP [ 0 ] [ 0 ] = 1 ;
19          のためにINT iが= 1 ; iが<= N; ++ i)の
 20          {
 21              のInt J = 0 ; J <M; ++ J)
 22は             、{
 23は、                 IF(DP [I- 1 ] [J])// それぞれが見つけるために時間を見つけなければならないので、トピックは、素子の第1のオフセットスタックを説明しているため要素がオフセットされた位置
24                  {
 25                      IF(&J 。1// この決意は、位置番号を決定するために使用される場所にそれを排除されていない
26ことである                     {
 27                          DP [I]、[J >> 1 ] = 1 ;   // この圧縮された状態j以降の状態に10箇所それ以下、1ので、エンドj上>>こと
28                      }
 29                      他の
30                      {
 31は                         INT= T 0 ; //は、実際にシンクいくつかの位置の位置を記録
32の                         ためのint型 = Kを1。 ; K <= 8 ; ++ K)
 33は                         、{
 34は                             IF!((&J(1)<< K)&& KT <= 5 && V [I] == V [I + K])
 35                              {
 36                                  DP [I] [(J >> 1)|(1 <<( - K- 1))] = 1 ;
 37                              }
 38である                              IF(J&(1 <<))ここで、K
 39                                  Tは++ 40                          }
 41                      }
 42                  }
 43              }
 44          }
 45          であれば(DP [n]が[ 0 ] == 1 46              のprintf(" 1 \ n " );
47          のprintf(" 0 \ N " );
48      }
 49      リターン 0 50 }

 

おすすめ

転載: www.cnblogs.com/kongbursi-2292702937/p/12082026.html