あなたの配列の長さn、及びコストの式を得、次いで最も費用を求めて:質問は意図されている[シグマ私は= LのR&LT A I - K ⌈ R&LT - Lの+を1 M [シグマ私は= LのR&LT A I - Kを⌈ R&LT - Lの+ 1。M 、
一般的にサブコストの問題は確かDPには思い浮かぶであろう、DPによってどの状態を示すために必要である
。この問題は、結合及び最大連続配列され、配列の長さ、コストに影響
による長さの影響したがって、ステータス情報だけではなく、現在の位置を記録する
DPを[I] [j]を、 iがjがサイズ以外で、現在の位置である; DP [I] [1]〜ながら [I] [m]はDP も含ますべてのサブシーケンスの長さの状態
私たちは主に順番に考慮されるが原因の長さに隣接状態を転送マイナスkの問題は、
より多くのマイナスKであることを:J = 1、現在の1を取るのいずれかのことを意味し、またはそれは事前にI-ですmが1であり、状態から転送します
場合減少K:他の中間状態から意味J> 1は、I-1、J-1を直接状態に
完全なコード:
書式#include <cstdioを>
する#include <iostreamの>
名前空間stdを使用。
typedefの長い長いLL。
const int型INF = 0x3f3f3f3f。
CONST int型N = 3E5 + 5。
LL [N]。
// LL和[N]。
LL DP [N] [20]。
INTのmain()
{
int型N、M、K。
CIN >> N >> M >> K。
[0] = 0;
以下のために(INT I = 1; I <= M; iは++)DP [0] [I] = -INF。
LL ANS = 0。
以下のために(INT i = 1; iが<= N; iは++){
CIN >> [I]。
用(INTのJ = 1; J <= Mであり、j ++){
IF(J == 1)DP [I] [J] = MAX([I] - K、DP [I - 1] [M] + [I] - K)。
ANS = MAX(ANS、DP [I] [J])。
}
}
COUT << ANS << ENDL。
0を返します。
}