特別DPの問題にこんにゃくソリューション

はじめに:常に練習DPに望んでいた、神はただつかみ合いの服を破りました。彼は問題の最初の解決策を書き込もうとしましたので、兄をcgold気まぐれな問題の解決策で見納め。残念ながら、こんにゃくの能力は、貧しい人々は非常に問題外でない他の首長が研究を運ぶために持っていた問題への解決策を処方します。

タイトル

https://vjudge.net/contest/355951#problem/A

この問題は、問題がdo非常に痛みを伴うプロセスであり、

Iチーズ李間違ったタイトルの二重の意味。

私はそれが対角線上にある必要がありますと思いました

実際には、それだけでnは行います*です。

アイデアは、左コーナー、と同じ長さの統計の上縁から更新を開始することが考えられます

書式#include <iostreamの> 
の#include <cstdioを> 
する#include <fstreamの> 
の#include <アルゴリズム> 
書式#include <cmath> 
の#include <両端キュー> 
の#include <ベクトル> 
の#include <キュー> 
の#include < 文字列 > 
の#include <CStringの> 
#include <マップ> 
の#include <スタック> 
の#include < 設定 > 
の#include <sstream提供>
 の#define IOS ios_base :: sync_with_stdio(0)。cin.tie(0)。
LL長い長
 の#define INF 0x3f3f3f3f 
 の#define MEM(X、Y)のmemset(X、Y、はsizeof(X))
 の#define MAXN 100005
 の#define P対<整数、整数>
 使用して 名前空間STDを、
チャー [ 1005 ] [ 1005 ]。
int型 DP [ 1005 ] [ 1005 ];
int型のn; 


INT のmain()
{ 
    int型N、ANS。
    一方、(CIN >> N、N)
    { 
        ANS = 1 以下のためのint型 I = 0; I <N; I ++ のためのINT J = 0 ; J <nであり、j ++ 
            { 
                CIN >> [j] [i]は、
            } 
        ためINT iは= 0、I <N; I ++ 
        { 
            ためINT J = N - 1 ; J> = 0 ; j-- 
            { 
                DP [I] [J] = 1 もし(I == 0 || J == N - 1継続;
                INT Q = DP [I - 1 ] [J + 1 ]。
                int型のk = 1 ; K <= Q K ++ 
                { 
                    もし - ([K I] [J] == [I] [J + K])DP [I] [J] ++ ;
                    他に 休憩; 
                } 
                ANS = MAX(ANS、DP [I] [J])。
            } 
        } 
        のprintf(" %dの\ n " 、ANS)。
    } 
    戻り 0 
}

 

 Bタイトル

https://vjudge.net/contest/355951#problem/B

この問題は少し難しいです。

直接組立ラインオフこんにゃく。

オンラインギャングスターの方法は、次のバーを学びます

DP(J、K)を表し、候補jを取って、差はそれほど最大値は(この方式は、「プログラムDP(j、k)が」と呼ばれている)であることを、すべてのプログラム、防衛および制御プログラムに議論kを制御しています議論と制御

#include <cstdioを> 
する#include <CStringの> 
する#include <iostreamの> 
する#include <cmath> 
の#include <ベクトル> 
の#include <アルゴリズム> 
の#include <ストリング> 
の#include <地図> 
使用して名前空間STD; 

の#define N 220 
の#define MET(A、B)のmemset(A、B、はsizeof(A))
の#define INF 0xFFFFFFの
長いロング最大= 2000000000; constの
長いロングLLのtypedef; 

INT D [N]、P [N]; 
int型DP [30] [ 1000年]; /// DP [I] [k]は個々のI選ばれる基を表し、kは防御の微分制御及び最大制御防御である
INTプレ[30] [1000] ; ///予め[I] [k]が格納されていますそれが最後の人物から選択される
整数回答[N]; ///このレコード選択パーソナル数mの

整数のmain()
{ 
    int型N-、M、= ICASE 1; 

    一方(scanfの( "%D%D"、およびN- 、&​​M)N || M) 
    {|| N M) 
        もしI、J、K、T1、T2。
 
        メチオニン(D、0); 
        メチオニン(P、0); 
        メチオニン(DP、-1); 
        メチオニン(プリ、0); 
        メチオニン(0回答)

        用(I = 1; I <= N; I ++)
            scanfの( "%D%D"、&D [I]、およびP [I]); 

        最小= M * 20である。最もmにおける///防衛制御微分* 20は、   
        DP [0] [分] = 0;初期状態0に///最初のセット


        K [-Min、分]の///最大範囲が、アレイは、負の数で表されるので、右側に配列することができません翻訳分は、精製して[0、2 *分] 
        (I = 0; I <= M; I ++)のために
        { 
            ため(K = 0; K <=最小* 2; K ++)
            { 
                IF(DP [I] [K] == - 1)継続; ///存在する場合、[I] [k]は次の状態であるDP見つける

                。(J = 1、J <= N; J ++)
                {
                        (DP [I + 1] [+ K D [J] -P [J] <DP [I] [K] + D [J] + P [J])IF 
                        { 
                            ; T1 = I、K T2 = 

                            しばらく(!T1> 0 &&事前[T1]、[T2] = J)   
                            { 
                                T2 - D = [プレ[T1]、[T2] - P [プレ[T1]、[T2]]; 
                                T1 - ; 
                            } 
                            (T1 IF == 0)// T1は番号j、0である人物があまりにも選択されていない前
                            { 
                                DP [I + 1] [+ K D [J] -P [J] DP = [I] [ K] + D [J] + P [J]; 
                                プレ[I + 1] [+ K D [J] -P [J] = J; 
                            } 
                        }
 
                } 
            } 
        } 

        int型FF =ミン; 
        のInt NUM = 0、0 = SUM1、SUM2 = 0; 

        ///個々に尋ねるNUM、主張最小差制御を選択するm個の制御議論最小差から選択され
        、一方(DP [M] [FF- NUM] == - 1 && DP [M] [+ FF NUM] == - 1)NUM ++; 

        IF(DP [M] [FF-NUM]> DP [M] [NUM FF +])= T2-FF NUM ; 
        そうでなければT2 = FF + NUM; 

        T1 = M; 

        のための(I = 1; I <= M; I ++)
        { 
            [I] = [T1]、[T2]を事前に回答; 

            + = D SUM1は、[I]回答]と、
            ; + P = SUM2は、[I]回答] 

            - T1、
            T2 - Dを= [回答[I] - P [回答[I]]; 
        } 

        のprintf( "%Dジュリー#\ N-"、ICASE ++)。
        printf( "ベスト陪審は、防衛のための訴追と値%dの値%dを有するます:\ n"、SUM1、SUM2)。


        ソート(回答+ 1、回答+ 1 + M)。
 
        私は=(1; I <= M; I ++)
            printf( "%dの"、回答[I])。

        printf( "\ N \ N"); 
    } 
    0を返します。
}

  

おすすめ

転載: www.cnblogs.com/cyq123/p/12296640.html