[OpenJ_Bailian - 4152]ベストプラス表現

ベストプラス表現


説明:

与えられたn個の1-9の数、Mプラスデジタル数(プラス側が番号を有していなければならない)、値が最小の式を加算することによって得られ、値を出力するようにとの間に配置された要件。例えば、1234 Plusで配置され、最良の方法は、12 + 34、および36を置くことです

入力

データのない15の以上のセット 
2つのデータ行の各セット。Mプラス記号(0 <= M <= 50入れて示すと、最初の行は、Mの整数である  )
第二行は桁数です。総数nは50以上であり、m <= N-1でありません

出力

データ値の各セット、加算式の最小出力

サンプル入力

2

123456

1

123456

4

12345

サンプル出力

102

579

15

ヒント

高精度計算を使用するように、長い長い整数を格納するための、すなわち大アレイにフィット、及び垂直列の大整数アナログ方法を添加しています。

トピックリンク:

https://vjudge.net/problem/OpenJ_Bailian-4152

 

 DP [i] [j]は、iとjを加えて得られた最小の番号の前に追加の数を示します。[I] [J] =分(DP [X] [J-1] + num個の[X + 1] [I])ここで、x> = jとX DP伝達方程式<I NUM [X + 1] [I ]私は最初のビットにX + 1ビットの組成を表します。理解することは難しいかもしれない、理解するのに役立ち、紙を描画しようとする例えば、見ていません

ACコード:

1の#include <iostreamの>
 2の#include <cstdioを>
 3の#include <fstreamの>
 4の#include <アルゴリズム>
 5の#include <cmath>
 6の#include <両端キュー>
 7の#include <ベクトル>
 8の#include <キュー>
 9#含む< ストリング >
 10の#include <CStringの>
 11の#include <地図>
 12の#include <積層>
 13の#include < 設定 >
 14の#include <sstream提供さ>
 15  の#define ME0(X)のmemset((X)、0、
sizeof((X))) 16  使って 名前空間をSTD;
 17  のconst  int型 L = 100 ;
 図18は、ある 文字列 DP [ 100 ] [ 100 ];
 19  文字の追加(文字 A、文字列 B)// 2つだけの非負整数和
20は 、{
 21である     文字列ANS;
 22である     INT NA [ L] = { 0 }、Nbの[L] = { 0 };
 23である     INTラ= a.size()、LB = b.size();
 24      INT I = 0 ; Iは、Laを<; I ++は25          のNa [LA-1 -疑わしい]は[I] = ' 0 'を26      のためには、int型、I = 0 ; iがLBを<; I ++ 27          NB [PcBLIC 1疑わしい] = B [I] - ' 0 ' 28      int型 LMAX =ラ>ポンド?ラ:ポンド。
29      のためには、int型 i = 0 ; I <LMAX、iは++ 30          の[I] + = NB [I]、[I + 1 ] + = [I] / 10、[I]%= 10 31      であれば([LMAX])
 32          LMAX ++ 33     以下のためにint型 I = lmax- 1 ; I> = 0 ; i-- 34の          ANS + = [i]は+ナ' 0 ' 35の     リターンANS;
36  }
 37  分(文字列文字列 B)// 判断大小
38  {
 39      であれば(a.length()< てb.length())
 40          リターン;
41      他の 場合(てb.length()< a.length())
 42          リターンB。
43      
44         戻る <bは?A:B;
45  }
 46  のint main()の
 47  {
 48      INT M。
49      文字列sの。
50      一方(CIN >> M >> S)
 51      {
 52          のS = "  " + S。
53          INT LEN = s.length()。
54          のためにint型 I = 0 ; iがLEN = <; Iは++ 55              DP [I] [ 0 ] = s.substr(1 、I)。
56          のためのint型J = 1。 ; Jは<= M; J ++ 57である         {
 58              のためにint型 I = 0 Iは= LEN <; I ++は59              {
 60                  のためintは X = J; Xは、<Iは、X ++ 61であり                 、{
 62である /// / Xフロントの数及び'+'明確に確立されていない、等しく、X-1番目の"+"まで、個体が処置される数X 
63は、                     IF(X == J)
 64                          DP [I]、[J]を追加し= (DP [X] [J- 1 ]、s.substr(Xの+ 。1、I- X));
 65  //                     他の場合に、状態遷移方程式
66                     他の
67                          DP [I] [J] =分(DP [I]、[J]、ADD(DP [X] [J- 1 ]、s.substr(X + 1、I- X)))。
68                  }
 69              }
 70          }
 71          COUT << DP [LEN] [M] << ENDL。
72      }
 73 }

 

おすすめ

転載: www.cnblogs.com/sky-stars/p/10944943.html