锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
F[i][j]=max{F[i1][j1] - (sA[i-1]-sA[i1])2 - (sB[j-1]-sB[j1])2} + A[i]*B[j], 0<=i1<i, 0<=j1<j
瀵硅繖涓紡瀛愯繘琛屽寲綆錛?br />F[i][j]=max{F[i1][j1] - sA[i1]2 + 2*sA[i-1]*sA[i1] - sB[j1]2 + 2*sB[j-1]*sB[j1]}+A[i]*B[j]-sA[i-1]2-sB[j-1]2
瀵逛簬涓緇寸殑鎯呭喌錛屽緢瀹規槗澶勭悊——涓棿灝辨槸涓鏉$洿綰匡紝鐒惰岃繖鏄簩緇寸殑錛屽浜庤繖縐?D/2D鐨凞P鏂圭▼錛岃浼樺寲鍒癘(N2)綰у埆錛岄渶瑕佷袱姝ャ?br />娉ㄦ剰鍒板喅絳栧紡涓櫎浜咶[i1][j1]澶栵紝鍏跺畠閮ㄥ垎閮借涔堝彧涓巌1鏈夊叧錛岃涔堝彧涓巎1鏈夊叧銆傚洜姝わ紝鍙互鎶婇樁孌礽鐨勫悇涓姸鎬佷綔涓轟竴涓暣浣擄紝鍦ㄤ箣鍓嶅緱鍑虹殑鍚勪釜F[i][j]涓紝瀵逛簬鐩稿悓鐨刯錛屾壘鍒板浜庣洰鍓嶇殑i錛屾渶浼樼殑閭d釜鍐崇瓥——娉ㄦ剰錛屽浜庣浉鍚岀殑j1錛岄噷闈㈡墍鏈変笌j1鏈夊叧鐨勪笢瑗塊兘鍙互鍏堜笉鑰冭檻浜嗭紝鍙冭檻(F[i1][j1] - sA[i1]2 + 2*sA[i-1]*sA[i1])瀵逛簬鐩墠i鐨勬渶浼樺喅絳栥傝繖涓姝ュ彲浠ュ湪榪欎簺鐩寸嚎褰㈡垚鐨勪笂鍑稿3涓壘鍒幫紝涓旀弧瓚沖喅絳栧崟璋冩э紝鍙互鐢ㄤ竴涓爤澶勭悊錛堟枩鐜囦紭鍖栵級銆傜劧鍚庯紝灝嗚繖浜涙渶浼樺喅絳栦互j涓鴻嚜鍙橀噺鍐嶇粍鎴愪竴浜涚洿綰匡紝鐢ㄦ爤緇存姢瀹冧滑鐨勪笂鍑稿3錛屽浜庢瘡涓猨錛屾壘鍒版渶浼樺煎嵆鍙?br />娉ㄦ剰浜嬮」錛氬湪鏍堜腑鍒犻櫎鐩寸嚎鐨勬椂鍊欙紝濡傛灉涔嬪墠鐨勬渶浼樺喅絳栨槸榪欎釜琚垹鎺夌殑鐩寸嚎錛屽垯瑕佸皢鏈浼樺喅絳栧厛緗負涓嶅瓨鍦紝鐒跺悗鍐嶆彃鍏ユ柊鐩寸嚎鍚庤涓烘柊鐩寸嚎銆傚彟澶栵紝瑕佺壒鍒敞鎰忓鉤琛岀殑鎯呭喌銆?br />
銆?銆慙CIS
緇忓吀闂錛屽埄鐢ㄤ笂闈㈢殑鍒嗘浼樺寲鎬濇兂錛屽緢瀹規槗鐢ㄧ嚎孌墊爲寰楀埌涓涓狾(N2logN)鐨勫仛娉曘?br />
銆?銆?a title="[SCOI2010]鑲$エ浜ゆ槗 " >[SCOI2010]鑲$エ浜ゆ槗
F[i][j]=max{F[i-1][j], max{F[i-W-1][j-a]-A*a, F[i-W-1][j+b]+b*B}}, j<=maxP, 1<=a<=maxA, 1<=b<=maxB
娉ㄦ剰瀵逛簬鐩稿悓鐨刯錛岃綆楁柟娉曟槸涓鏍風殑錛屼笖鏄竴鏉$洿綰匡紙鐢變簬鏈夎寖鍥存墍浠ュ叾瀹炴槸綰挎錛夈?br />鎵浠ワ紝璁$畻闃舵i鏃訛紝鍙互灝?i-W-1)闃舵鎵鏈夌殑鍐崇瓥褰撴垚綰挎鎻掑叆錛岃繖浜涚嚎孌電殑鏂滅巼閮界浉絳夛紝鍥犳姣旇緝濂界淮鎶わ紝鍙渶瑕佸垽鏂竟鐣屽嵆鍙?br />
娉ㄦ剰錛孨OI2011鐨剆how铏界劧涔熺鍚堝浜庣浉鍚岀殑j璁$畻鏂規硶涓鏍鳳紝浣嗗畠灝變笉鑳戒紭鍖栵紝鍥犱負瀹冪殑鍐崇瓥鏄笉榪炵畫涓旀棤瑙勫緥鐨勶紝娌℃湁浠諱綍鍑犱綍鎬ц川銆傚洜姝わ紝瀹冨彧鑳界敤O(N3)鐨勭畻娉曡綆楀嚭鎵鏈夌姸鎬併?br />
]]>
]]>
棣栧厛錛岀湅榪欎箞灝忕殑鑼冨洿灝辯煡閬擄紝鏁板鏂規硶鑲畾鎼炰笉浜?#8230;…鍙堟兂涓嶅埌鍏跺畠妯″瀷……鍙兘鐢ㄧ姸鍘嬬‖鎼炰簡鍥?#8230;…
闂鏄紝5^15紼砊錛屽鏋滆兘鍊掕繃鏉ワ紝15^5錛屽氨涓嶄細T浜嗐?br />鍙互鍙戠幇錛孋鍊肩浉鍚岀殑棰滆壊鏈川涓婃槸涓鏍風殑……鍥犳錛屽彧闇瑕佷繚瀛樼洰鍓岰鍊間負1銆?銆?銆?銆?鐨勯鑹插悇鏈夊灝戠灝辮浜嗗洤……錛堝綋鐒跺湪榪囩▼涓繕浼氬嚭鐜癈鍊間負0鐨勶紝鍗崇敤瀹岀殑棰滆壊錛屼笉榪?銆?銆?銆?銆?銆?鐨勫拰鏄鑹叉繪暟錛岃屼笖浠庝笅闈㈠彲浠ョ湅鍑猴紝C鍊間負0鐨勭‘瀹?#8220;鏈ㄦ湁鐢?#8221;錛夛紱
璁綟[s1][s2][s3][s4][s5][v]涓烘秱瀹屽墠鑻ュ共涓湪鍧楋紙榪欎釜涓暟鍙互閫氳繃s1~s5綆楀嚭錛屼笉榪囨垜浠茍涓嶉渶瑕佸畠鍥?#8230;…錛夊悗錛孋鍊間負1~5鐨勯鑹插悇鏈塻1锝瀞5縐嶏紝涓旇繖鑻ュ共涓腑鐨?strong>鏈鍚庝竴涓秱鐨勯鑹茶繕鍓╃殑C鍊?/span>涓簐錛堟樉鐒?<=v<=4錛夈?br />杈圭晫錛欶[S[1]][S[2]][S[3]][S[4]][S[5]][0]=1錛屽叾浣欎負0錛圫[i]涓轟竴寮濮婥鍊間負i鐨勯鑹茬鏁幫級銆?br />璁$畻F鏃訛紝鍓嶆帹鍚庯紙娉ㄦ剰欏哄簭錛屾槸鎸夌収S[5]閫嗗簭鏈鍏堬紝鍐嶄緷嬈℃槸S[4]锝濻[1]錛岄兘鏄嗗簭錛寁鍙換鎰忓畾搴忥級錛屾灇涓句笅涓涓湪鍧楃殑棰滆壊鏄幇鍦ㄨ繕鍓╁灝戠殑錛屽鏋滃畠涓庣洰鍓嶇殑榪欎釜錛堟渶鍚庝竴涓級鍓╃殑鐩稿悓錛屽垯瑕佸噺1錛屽惁鍒欎笉鍑忋傚叿浣撶殑鏂圭▼瑙佷唬鐮併?br />娉ㄦ剰緇嗚妭錛氭灇涓綟鐨剆1~s5涓嬫爣鏃訛紝閮借N錛堥鑹叉繪暟錛夊紑濮嬫灇涓撅紝鍥犱負榪囩▼涓煇浜泂鍊間細澧炲姞錛?br />
鏈鐨勫惎紺哄氨鏄紝鍦ㄨ璁$姸鍘婦P鐨勬椂鍊欙紝濡傛灉姝g潃鏉ヤ笉琛岋紝鍙互鍙嶇潃鏉ワ紝鎴栬灝辮兘璁捐鍑虹鍚堣姹傜殑瑙f硶銆?br />
浠g爜錛?br />
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
#define re1(i, n) for (int i=1; i<=n; i++)
#define re2(i, l, r) for (int i=l; i<r; i++)
#define re3(i, l, r) for (int i=l; i<=r; i++)
#define rre(i, n) for (int i=n-1; i>=0; i--)
#define rre1(i, n) for (int i=n; i>0; i--)
#define rre2(i, r, l) for (int i=r-1; i>=l; i--)
#define rre3(i, r, l) for (int i=r; i>=l; i--)
#define ll long long
const int n = 5, MAXM = 16, MOD = 1000000007;
int m, S[n + 1];
ll F[MAXM][MAXM][MAXM][MAXM][MAXM][n], res;
void init()
{
scanf("%d", &m); int x;
re(i, m) {scanf("%d", &x); S[x]++;}
}
void solve()
{
F[S[1]][S[2]][S[3]][S[4]][S[5]][0] = 1; int tmp;
rre3(i5, m, 0) rre3(i4, m, 0) rre3(i3, m, 0) rre3(i2, m, 0) rre3(i1, m, 0) re(v, n)
if (F[i1][i2][i3][i4][i5][v]) {
if (i1) {
if (v == 1) tmp = i1 - 1; else tmp = i1;
if (tmp) {
F[i1 - 1][i2][i3][i4][i5][0] += tmp * F[i1][i2][i3][i4][i5][v];
F[i1 - 1][i2][i3][i4][i5][0] %= MOD;
}
}
if (i2) {
if (v == 2) tmp = i2 - 1; else tmp = i2;
if (tmp) {
F[i1 + 1][i2 - 1][i3][i4][i5][1] += tmp * F[i1][i2][i3][i4][i5][v];
F[i1 + 1][i2 - 1][i3][i4][i5][1] %= MOD;
}
}
if (i3) {
if (v == 3) tmp = i3 - 1; else tmp = i3;
if (tmp) {
F[i1][i2 + 1][i3 - 1][i4][i5][2] += tmp * F[i1][i2][i3][i4][i5][v];
F[i1][i2 + 1][i3 - 1][i4][i5][2] %= MOD;
}
}
if (i4) {
if (v == 4) tmp = i4 - 1; else tmp = i4;
if (tmp) {
F[i1][i2][i3 + 1][i4 - 1][i5][3] += tmp * F[i1][i2][i3][i4][i5][v];
F[i1][i2][i3 + 1][i4 - 1][i5][3] %= MOD;
}
}
if (i5) {
F[i1][i2][i3][i4 + 1][i5 - 1][4] += i5 * F[i1][i2][i3][i4][i5][v];
F[i1][i2][i3][i4 + 1][i5 - 1][4] %= MOD;
}
}
res = F[0][0][0][0][0][0];
}
void pri()
{
cout << res << endl;
}
int main()
{
init();
solve();
pri();
return 0;
}
]]>
鍏稿瀷鐨勪簩嬈¢掓帹/DP鐨勯鐩?br />棣栧厛錛岄鐩腑鐨?#8220;涓嶄究鍒╁?#8221;鎸囩殑鏄煇涓偣鍒版牴鐨勮礬寰勪笂鐨勬湪鏈夎閫夊畾閾捐鐩栫殑杈圭殑鏉℃暟銆?br />
絎竴闂細璁綟[i][0..2]鍒嗗埆涓哄綋瀛愭爲i涓粨鐐筰鐨勭姸鎬佷負涓嶅弬涓庨摼錛?錛夈佷綔涓烘煇閾劇鐐癸紙1錛夈佷綔涓烘煇閾句腑闂寸偣錛?錛夋椂錛屽瓙鏍慽涓殑緇撶偣鍒癷鐨勬渶灝忎笉渚垮埄鍊箋備負浜嗗緱鍒癋錛岄渶瑕佽绔婫[j][k(0..2)]琛ㄧず緇撶偣i鐨勫墠j媯靛瓙鏍戜腑錛屾湁k媯電殑鏍圭粨鐐逛笌緇撶偣i鎺ヤ笂鐨勬渶灝忕殑鏈澶т笉渚垮埄鍊箋傛樉鐒訛紝涓嶅拰i鎺ヤ笂鐨勶紝鐘舵佷負0銆?銆?閮借錛屼絾涓嶄究鍒╁艱鍔?錛岃屽拰i鎺ヤ笂鐨勭姸鎬佸彧鑳芥槸0鎴?錛屼笉鍔?銆?br />
闂鏄浜岄棶銆傜浜岄棶鐨勯毦鐐瑰湪浜庯紝褰搃鍙栧緱鏈灝忎笉渚垮埄鍊兼椂錛宨鐨勬瘡涓瓙緇撶偣騫墮潪閮藉彇鍒版渶灝忎笉渚垮埄鍊?/strong>銆備婦涓緥瀛愶紝緇撶偣i鐨勬渶灝忎笉渚垮埄鍊間負3錛屽畠鐨勬煇涓瓙緇撶偣j鐨勬渶灝忎笉渚垮埄鍊間負2錛屽垯褰搄涓巌鎺ヤ笂鏃訛紝瀛愭爲j鐨勫唴閮ㄦ棦鍙互鍙栦笉渚垮埄鍊間負2鐨勮В錛屼篃鍙互鍙栦笉渚垮埄鍊間負3鐨勮В銆傛墍浠ワ紝涓轟簡瑙e喅絎簩闂紝闇瑕佹眰鍑虹粨鐐筰鐨勬渶灝忎笉渚垮埄鍊間負x鐨勮В鐨勬繪暟銆?strong>涓囧垢鐨勬槸錛寈鐨勮寖鍥村茍涓嶆槸澶ぇ錛屽彲浠ヨ瘉鏄庯紝x涓嶄細瓚呰繃log3N錛堜笅鍙栨暣錛夛紝涔熷氨鏄綋N=100000鏃秞鏈澶т負10銆?/span>鍥犳錛屾渶鍚庝粛鐒朵笉浼歍鎺夈?br />
榪欓鐨勪竴涓惎紺哄氨鏄紝鍦ㄦ眰綾諱技浜?#8220;鏈浼樿В璁℃暟”鐨勯棶棰樹腑錛?span style="color: red">涓嶈璁や負褰撳悗闈㈢殑鐘舵佸彇寰楁渶浼樿В鏃訛紝鍓嶉潰鐨勭姸鎬佷竴瀹氬彇寰楁渶浼樿В銆?/strong>鍥犳錛屼笉鑳藉彧璁板綍鏌愮姸鎬佸彇寰楁渶浼樿В鐨勪釜鏁幫紝鑰岃璁板綍璇ョ姸鎬佸彇寰楁瘡涓涓彲琛岃В鏃剁殑涓暟銆?br />
浠g爜錛?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
#define re1(i, n) for (int i=1; i<=n; i++)
#define re2(i, l, r) for (int i=l; i<r; i++)
#define re3(i, l, r) for (int i=l; i<=r; i++)
#define rre(i, n) for (int i=n-1; i>=0; i--)
#define rre1(i, n) for (int i=n; i>0; i--)
#define rre2(i, r, l) for (int i=r-1; i>=l; i--)
#define rre3(i, r, l) for (int i=r; i>=l; i--)
#define ll long long
const int MAXN = 100010, MAXW = 11, INF = ~0U >> 2;
struct edge {
int a, b, pre, next;
} E0[MAXN * 3], E[MAXN << 1];
int n, m0, m, Q[MAXN], F[MAXN][3], G[MAXN][3], res1 = 0;
ll MOD, FS[MAXN][MAXW][3], S[MAXN][MAXW][3], res2 = 0;
bool vst[MAXN];
void init_d()
{
re(i, n) E0[i].pre = E0[i].next = E[i].pre = E[i].next = i; m0 = m = n;
}
void add_edge0(int a, int b)
{
E0[m0].a = a; E0[m0].b = b; E0[m0].pre = E0[a].pre; E0[m0].next = a; E0[a].pre = m0; E0[E0[m0].pre].next = m0++;
E0[m0].a = b; E0[m0].b = a; E0[m0].pre = E0[b].pre; E0[m0].next = b; E0[b].pre = m0; E0[E0[m0].pre].next = m0++;
}
void add_edge(int a, int b)
{
E[m].a = a; E[m].b = b; E[m].pre = E[a].pre; E[m].next = a; E[a].pre = m; E[E[m].pre].next = m++;
}
void init()
{
int _M; scanf("%d%d", &n, &_M); cin >> MOD; if (_M < n - 1) {res1 = res2 = -1; return;} init_d(); int a0, b0;
re2(i, 1, n) {scanf("%d%d", &a0, &b0); add_edge0(--a0, --b0);}
}
void prepare()
{
re(i, n) vst[i] = 0; Q[0] = 0; vst[0] = 1; int x, y;
for (int front=0, rear=0; front<=rear; front++) {
x = Q[front];
for (int p=E0[x].next; p != x; p=E0[p].next) {
y = E0[p].b;
if (!vst[y]) {vst[y] = 1; Q[++rear] = y; add_edge(x, y);}
}
}
re(i, n) if (!vst[i]) {res1 = -1; res2 = -1; return;}
}
inline int minv3(int s1, int s2, int s3)
{
int s0 = s1 <= s2 ? s1 : s2;
return s0 <= s3 ? s0 : s3;
}
inline int minv2(int s1, int s2)
{
return s1 <= s2 ? s1 : s2;
}
void solve()
{
int x, y, len, v1, v2, v01, v02; ll sum;
rre(i, n) {
x = Q[i]; len = 0; G[0][0] = 0; G[0][1] = G[0][2] = INF;
for (int p=E[x].next; p != x; p=E[p].next) {
y = E[p].b; len++;
v1 = minv3(F[y][0], F[y][1], F[y][2]) + 1; v2 = minv2(F[y][0], F[y][1]);
G[len][0] = v1 >= G[len - 1][0] ? v1 : G[len - 1][0];
v01 = v1 >= G[len - 1][1] ? v1 : G[len - 1][1];
v02 = v2 >= G[len - 1][0] ? v2 : G[len - 1][0];
G[len][1] = minv2(v01, v02);
v01 = v1 >= G[len - 1][2] ? v1 : G[len - 1][2];
v02 = v2 >= G[len - 1][1] ? v2 : G[len - 1][1];
G[len][2] = minv2(v01, v02);
}
re(j, 3) F[x][j] = G[len][j];
re(j, MAXW) {S[0][j][0] = 1; S[0][j][1] = S[0][j][2] = 0;} len = 0;
for (int p=E[x].next; p != x; p=E[p].next) {
y = E[p].b; len++;
re(j, MAXW) re(k, 3) {
S[len][j][k] = 0;
if (j) {
sum = 0; re(k0, 3) {sum += FS[y][j - 1][k0]; if (sum >= MOD) sum -= MOD;}
S[len][j][k] = (sum * S[len - 1][j][k]) % MOD;
}
if (k) {
sum = 0; re(k0, 2) {sum += FS[y][j][k0]; if (sum >= MOD) sum -= MOD;}
S[len][j][k] = (S[len][j][k] + sum * S[len - 1][j][k - 1]) % MOD;
}
}
}
re(j, MAXW) re(k, 3) FS[x][j][k] = S[len][j][k];
}
res1 = minv3(F[0][0], F[0][1], F[0][2]);
res2 = 0; re(i, 3) if (F[0][i] == res1) res2 += FS[0][F[0][i]][i]; res2 %= MOD;
}
void pri()
{
cout << res1 << endl << res2 << endl;
}
int main()
{
init();
if (!res1) prepare();
if (!res1) solve();
pri();
return 0;
}
]]>
棰勫鐞嗭細璁綟[i]涓轟互i寮澶寸殑鏈闀夸笂鍗囧簭鍒楃殑闀垮害錛屾庝箞姹備笉鐢ㄨ浜嗗惂鍥?#8230;…
鍋囪鐩墠闇瑕佹眰闀垮害涓篗鐨勩佹爣鍙峰瓧鍏稿簭鏈灝忕殑涓婂崌搴忓垪錛屾樉鐒跺叾絎竴涓厓绱燗[i]蹇呴』婊¤凍F[i]>=M錛堟敞鎰忥紝涓嶆槸絳変簬錛屾槸澶т簬絳変簬錛侊級錛屾壘鍒版弧瓚寵繖涓潯浠剁殑鏈灝忕殑i鍗沖彲銆傜劧鍚庯紝璁劇洰鍓嶅凡緇忔眰鍑轟簡璇ュ簭鍒楃殑絎瑇涓厓绱犱負A[y]錛屽垯絎?x+1)涓厓绱燗[z]闇瑕佹弧瓚崇殑鏉′歡鏄疉[z]>A[y]錛屼笖F[z]=F[y]-1錛屾壘鍒版弧瓚寵繖涓潯浠剁殑鏈灝忕殑z鍗充負璇ュ簭鍒楃殑絎?x+1)涓厓绱犮傛寜鐓ц繖縐嶆柟娉曪紝鎵弿涓閬嶅氨鍙互姹傚嚭鏁翠釜搴忓垪錛屾椂闂村鏉傚害涓篛(N)銆傚鏋滄暣涓簭鍒楃殑鏈闀夸笂鍗囧簭鍒楅暱搴?lt;M錛屽垯鏃犺В銆?br />
浠g爜錛?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
#define re1(i, n) for (int i=1; i<=n; i++)
#define re2(i, l, r) for (int i=l; i<r; i++)
#define re3(i, l, r) for (int i=l; i<=r; i++)
#define rre(i, n) for (int i=n-1; i>=0; i--)
#define rre1(i, n) for (int i=n; i>0; i--)
#define rre2(i, r, l) for (int i=r-1; i>=l; i--)
#define rre3(i, r, l) for (int i=r; i>=l; i--)
#define ll long long
const int MAXN = 10010, MAXM = 1010, INF = ~0U >> 2;
int n, m, len, A[MAXN], F[MAXN], D[MAXN], res[MAXM];
void prepare()
{
D[len = 0] = INF; int l, r, mid;
rre(i, n) if (A[i] < D[len]) D[F[i] = ++len] = A[i]; else {
l = 0; r = len;
while (l < r) {
mid = l + r + 1 >> 1;
if (A[i] < D[mid]) l = mid; else r = mid - 1;
}
F[i] = l + 1; D[l + 1] = A[i];
}
}
void solve()
{
int x, y;
re(i, n) if (F[i] >= m) {
res[0] = A[i]; if (m == 1) return; x = m - 1; y = 1;
re2(j, i+1, n) if (F[j] >= x && A[j] > res[y - 1]) {res[y++] = A[j]; if (y == m) return; else x--;}
}
}
int main()
{
scanf("%d", &n); re(i, n) scanf("%d", &A[i]);
prepare();
int m_s; scanf("%d", &m_s);
re(i, m_s) {scanf("%d", &m); if (m > len) puts("Impossible"); else {solve(); re(j, m-1) printf("%d ", res[j]); printf("%d\n", res[m - 1]);}}
return 0;
}
銆?銆?a title="[HAOI2006]鏁板瓧搴忓垪
" >[HAOI2006]鏁板瓧搴忓垪
棣栧厛錛岀敱浜庡簭鍒楃殑鎵鏈夊厓绱犻兘鏄暣鏁幫紝鎵浠ュ彲浠ュ皢鍘熷簭鍒楃殑鎵鏈夊厓绱犲噺鍘誨畠鐨勪笅鏍囷紝榪欐牱灝辨妸涓婂崌搴忓垪杞寲涓轟笉涓嬮檷搴忓垪浜嗐?br />絎竴闂殑緇撴灉鏄劇劧灝辨槸(N-鏂板簭鍒楃殑鏈闀夸笉涓嬮檷搴忓垪闀垮害)銆傚叧閿湪浜庣浜岄棶銆備互涓婣鍧囪〃紺烘柊搴忓垪銆?br />璁綟[i]涓轟互A[i]緇撳熬鐨勬渶闀夸笉涓嬮檷搴忓垪闀垮害錛堝悓鏍鳳紝姹傛硶涓嶇敤璇翠簡錛夛紝G[i]涓哄湪A[i]涓嶄慨鏀圭殑鍓嶆彁涓嬪皢A[0..i]杞彉涓轟笉涓嬮檷搴忓垪鐨勬渶灝忎慨鏀歸噺銆傞鍏堟眰鍑篎[i]錛岀劧鍚庡湪姹侴[i]鏃訛紝鏋氫婦涓婁竴涓?#8220;涓嶅姩鐐?#8221;錛堝氨鏄笉淇敼鐨勫厓绱狅級A[j]錛堟樉鐒跺繀欏繪弧瓚矨[j]<=A[i]涓擣[j]=F[i]-1錛夛紝榪欐牱鏈灝忎慨鏀歸噺灝辨槸G[j]+(灝咥[j..i]杞彉涓轟笉涓嬮檷搴忓垪鐨勬渶灝忎慨鏀歸噺錛夈傚彲浠ヨ瘉鏄庯紝A[j..i]鐨勬渶浼樹慨鏀規柟妗堝繀鐒舵槸灝咥[j+1..t]鍏ㄩ儴淇敼涓篈[j]錛孉[t+1..i]鍏ㄩ儴淇敼涓篈[i]錛岃繖閲宼鏄竴涓猍j..i]鑼冨洿鐨勫箋傞棶棰樺氨鏄浣曟眰鍑烘渶浼樼殑t錛?br />涓寮濮嬶紝鍋囪t=j錛屽嵆鎶夾[j+1..i-1]鍏ㄩ儴淇敼涓篈[i]錛岃綆楀嚭淇敼閲忥紝璁句負S銆傜劧鍚庯紝鐢變簬A[j+1..i-1]涔嬮棿鐨勫厓绱犺涔堝皬浜嶢[j]錛岃涔堝ぇ浜嶢[i]錛堣繖涓槸鏄劇劧鐨勫洤錛夛紝鎴戜滑鎶婂皬浜嶢[j]鐨勫厓绱犵О涓?#8220;灝忔暟”錛屾妸澶т簬A[i]鐨勫厓绱犵О涓?#8220;澶ф暟”錛屽垯褰搕鍙杢0鏃訛紝淇敼閲忎負S-(A[i]-A[j])*(A[j+1..t0]涓殑“灝忔暟”涓暟鍑忓幓“澶ф暟”涓暟錛夈傝繖鏍鳳紝鍙渶鎵弿涓涓嬶紝姹傚嚭浣垮緱(A[j+1..t0]涓殑“灝忔暟”涓暟鍑忓幓“澶ф暟”涓暟錛夊兼渶澶х殑t0鍗沖彲銆?br />褰撶劧榪樻湁涓涓棶棰橈紝瀵逛簬鍚屼竴涓猧錛屾弧瓚?#8220;A[j]<=A[i]涓擣[j]=F[i]-1”鐨勫厓绱犱釜鏁板彲鑳芥湁寰堝錛屽鏋滀竴涓竴涓灇涓撅紝涓涓竴涓壂鎻忥紝浼氬緢鎱㈢殑鍥?#8230;…瑙e喅鏂規硶鏄紝姹傚嚭婊¤凍榪欎釜鏉′歡鐨刯涓渶灝忕殑涓涓紝璁句負j0錛岀劧鍚庢妸A[j0+1..i-1]涓殑鎵鏈?#8220;灝忔暟”鍜?#8220;澶ф暟”鍏ㄩ儴澶勭悊鍑烘潵錛岀劧鍚庣敤綾諱技鍓嶇紑鍜岀殑鏂規硶灝辮兘鎼炰簡鍥?#8230;…褰撶劧錛屼負浜嗘壘鍒癹0錛岄渶瑕佸緩涓涓簩鍒嗗浘錛岃竟涓?F[i], i)銆?br />鏈鍚庯紝涓轟簡鏂逛究錛屽彲浠ユ妸A搴忓垪鐨勫乏杈瑰姞涓涓?INF錛屽彸杈瑰姞涓涓?INF銆傛渶鍚庢葷殑鏃墮棿澶嶆潅搴︼紝鐞嗚涓婁負O(N2)錛屼絾鐢變簬鏄殢鏈烘暟鎹紝鎵浠ヨ繙榪滆揪涓嶅埌榪欎釜綰у埆銆?br />
浠g爜錛?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
#define re1(i, n) for (int i=1; i<=n; i++)
#define re2(i, l, r) for (int i=l; i<r; i++)
#define re3(i, l, r) for (int i=l; i<=r; i++)
#define rre(i, n) for (int i=n-1; i>=0; i--)
#define rre1(i, n) for (int i=n; i>0; i--)
#define rre2(i, r, l) for (int i=r-1; i>=l; i--)
#define rre3(i, r, l) for (int i=r; i>=l; i--)
#define ll long long
const int MAXN = 40010, INF = ~0U >> 2;
struct edge {
int a, b, pre, next;
} E[MAXN << 1];
int n, m, A[MAXN], D[MAXN], F[MAXN], W[MAXN], res1;
ll G[MAXN], res2;
void init_d()
{
re(i, n) E[i].pre = E[i].next = i; m = n;
}
void add_edge(int a, int b)
{
E[m].a = a; E[m].b = b; E[m].pre = E[a].pre; E[m].next = a; E[a].pre = m; E[E[m].pre].next = m++;
}
void init()
{
scanf("%d", &n);
A[0] = -INF; re1(i, n) {scanf("%d", &A[i]); A[i] -= i;} A[++n] = INF; n++;
}
void solve()
{
init_d(); F[0] = 0; G[0] = 0; D[0] = -INF; add_edge(0, 0); int len = 0, l, r, mid, x, maxw; ll sum, tmp;
re2(i, 1, n) {
if (A[i] >= D[len]) D[F[i] = ++len] = A[i]; else {
l = 0; r = len;
while (l < r) {
mid = l + r + 1 >> 1;
if (A[i] >= D[mid]) l = mid; else r = mid - 1;
}
D[F[i] = ++l] = A[i];
}
for (int p=E[F[i]-1].next; ; p=E[p].next) if (A[i] >= A[x = E[p].b]) break;
W[x] = 0; re2(j, x+1, i) if (A[j] < A[i]) W[j] = W[j - 1] + 1; else W[j] = W[j - 1] - 1;
sum = 0; maxw = -INF; G[i] = ~0Ull >> 2;
rre2(j, i, x) {
if (A[j] <= A[i] && F[j] == F[i] - 1) {
tmp = G[j] + sum; if (tmp < G[i]) G[i] = tmp;
tmp = G[j] + sum - (ll) (maxw - W[j]) * (A[i] - A[j]); if (tmp < G[i]) G[i] = tmp;
}
if (A[j] > A[i]) sum += A[j] - A[i]; else sum += A[i] - A[j];
if (W[j] > maxw) maxw = W[j];
}
add_edge(F[i], i);
}
res1 = n - F[n - 1] - 1; res2 = G[n - 1];
}
void pri()
{
cout << res1 << endl << res2 << endl;
}
int main()
{
init();
solve();
pri();
return 0;
}
]]>
璇村疄璇濇垜絎竴嬈″皾璇曞啓鐐叺闃靛湴鏄湪2009騫?#8230;…宸茬粡榪囧幓涓ゅ勾澶氫簡錛岀粓浜庢壘鍒頒簡涓涓ソ鐨勮В娉?#8230;…搴嗙涓涓?#8230;…
銆愮姸鎬佸帇緙〥P銆?br />鎵璋撶姸鎬佸帇緙〥P錛屽氨鏄浜庢煇浜汥P闂錛屾瘡涓闃舵鐨勭姸鎬侀兘鏈夊緢澶氱淮錛岃鍒╃敤鏌愪簺鎵嬫灝嗗畠浠帇緙╁埌涓緇達紙涓涓鏁存暟錛夛紝欏轟究榪涜鐘舵佺殑綺劇畝錛堝幓鎺変笉鍚堟硶鐨勭姸鎬侊級錛岀劧鍚庡啀榪涜DP銆傝繖閲岃鐨勪富瑕佹槸浼犵粺鐨勭姸鍘婦P錛屾湁涓縐嶅熀浜?#8220;鎻掑ご”鐨凞P錛屾洿楂樼駭錛屼互鍚庡啀鎼炪?br />瀵逛簬鏈錛屽彲浠ヨ璁″嚭涓涓繖鏍風殑鐘舵侊細[0..1][0..1][0..1]...[0..1]錛堟湁M涓猍0..1]錛夛紝琛ㄧず璇ヨ鐨勬瘡涓牸瀛愭斁涓嶆斁鐐叺錛屽鏋滄斁錛屼負1錛屽惁鍒欎負0銆傛樉鐒訛紝榪欐槸涓涓狹浣嶄簩榪涘埗鏁幫紝濡傛灉鑳芥妸瀹冧滑鍘嬬緝鎴愪竴涓猧nt灝卞ソ浜嗐?br />
銆愬浣曞帇緙┿?br />絎竴涓棶棰樻槸榪欎箞澶氱淮鐨勭姸鎬佸浣曞帇緙╃殑闂銆?br />瀵逛簬鏈錛岀敱浜庢槸浜岃繘鍒舵暟錛岀洿鎺ュ帇緙╁氨鍙互浜嗐備絾鏄浜庢煇浜涙儏鍐碉紝鐘舵佹槸涓笁榪涘埗鏁幫紙姣忎釜鏍煎瓙鐨勫睘鎬ч兘鏈?縐嶏級鐢氳嚦鏇村榪涘埗鏁幫紝榪欐牱錛岀洿鎺ュ帇緙╀細瀵艱嚧鏃犳硶浣跨敤浣嶈繍綆楋紝浠庤屼嬌“瑙e帇”鍙樺緱寰堥夯鐑︼紝鑰楁椂涔熷緢闀匡紙闇瑕佹毚鍔涳級錛屽洜姝わ紝鍙互灝嗘瘡浣嶄笁榪涘埗閮芥媶鎴愪袱浣嶄簩榪涘埗錛?br />0->00
1->01
2->10
錛堝綋鐒?鎷嗘垚10銆?鎷嗘垚11涔熸湪鏈夐棶棰橈紝鍙鑳藉尯鍒嗗紑灝辮浜嗭級
榪欐牱錛屾瘡涓姸鎬佸氨鍙互鐢?涓簩榪涘埗鏁版潵琛ㄧず錛屽彲浠ュ湪鏋勯犲嚭鎵鏈夊悎娉曠姸鎬佷互鍚庡皢姣忎釜鐘舵佹墍瀵瑰簲鐨勪袱浣嶄簩榪涘埗鏁板瓨鍒皊truct閲岄潰錛屼嬌鐢ㄦ椂璋冨嚭鍗沖彲銆?br />
銆愬浣曠簿綆銆?br />榪欎釜闂鏄渶閲嶈鐨勶紝鍥犱負錛屽鏋滀笉綺劇畝錛屽湪鏋氫婦鐘舵佷互鍙婅漿縐葷殑鏃跺欏氨浼氭灇涓懼埌寰堝涓嶅悎娉曠姸鎬侊紝瀵艱嚧鏃墮棿嫻垂銆?br />鎵璋撶簿綆錛屾槸鎸囧湪棰勫鐞嗕互鍙奃P榪囩▼涓紝灝介噺閬垮紑涓嶅悎娉曠姸鎬併?br />錛?錛夐澶勭悊涓殑綺劇畝錛?br />鍖呮嫭3涓儴鍒嗭細
<1>鎵懼埌鎵鏈夊彲鑳界殑鍚堟硶鐘舵佸茍緙栧彿錛氭牴鎹鎰忛檺鍒訛紝鏈夌殑鐘舵佸湪闃舵鍐呭氨涓嶅悎娉曪紙姣斿鏈錛屼竴琛屼竴闃舵錛岄偅涔堝嚒鏄湁涓や釜1浣嶇殑璺濈灝忎簬2鐨勭姸鎬侀兘涓嶅悎娉曪級錛岃屼笖榪欑鐘舵佹墍鍗犵殑姣旈噸寰寰榪樺緢澶э紙鏈涓紝M=10鏃訛紝涔熷彧鏈?0縐嶅彲鑳界殑鍚堟硶鐘舵侊級錛屾鏃訛紝涓轟簡鎵懼埌榪欎簺鍚堟硶鐘舵侊紝鍙互DFS鏋勯犲疄鐜般?br />闇瑕佹敞鎰忕殑鏄紝鏈夌殑棰樹笉鍏夎鎵懼埌涓涓樁孌靛唴鐨勫悎娉曠姸鎬侊紝榪樿鎵懼埌涓や釜鎴栦袱涓互涓婇樁孌靛唴鐨勫悎娉曠姸鎬侊紙姣斿閭d釜鏈夊叧澶氱背璇洪鐗岀殑棰橈級錛屾鏃墮渶瑕佷袱涓猧nt鍚屾椂DFS錛?br />鍦ㄦ壘鍒板悎娉曠姸鎬佷互鍚庯紝闇瑕佸姣忎釜鍚堟硶鐘舵佽繘琛岀紪鍙鳳紝浠ヨ揪鍒?#8220;鍘嬬緝”鐨勭洰鐨勩傝繖閲屽氨娑夊強鍒頒簡鐘舵佺紪鍙峰拰鐘舵佽〃紺虹殑闂錛氭瘮濡傦紝鐘舵?001錛岃〃紺轟負9錛屽湪DFS涓涓涓鎼滃埌錛屽洜姝ょ紪鍙蜂負0錛屼笉瑕佹悶娣蜂簡榪欎袱涓紙灝ゅ叾涓嶈鎼炴販“緙栧彿涓?”鍜?#8220;鐘舵佽〃紺轟負0”錛屽畠浠槸涓嶅悓鐨勶級銆傚湪棰勫鐞嗗拰DP鐨勮繃紼嬩腑錛屾墍鏈夋秹鍙婂埌鐘舵佺殑鏁扮粍涓嬫爣錛屽叏閮ㄦ槸緙栧彿鑰屼笉鏄〃紺猴紝鐭ラ亾緙栧彿瑕佹眰琛ㄧず錛屽彲浠ュ湪DFS涓褰曠殑鏁扮粍閲岄潰璋冿紝鑰岀煡閬撹〃紺鴻姹傜紪鍙鳳紝鍙互鍒╃敤閫嗘暟緇勬垨鑰呭搱甯岋紱
<2>鎵懼埌姣忎竴闃舵鐨勫悎娉曠姸鎬侊細鍗充嬌鏄?lt;1>涓鍒ゅ畾涓哄悎娉曠殑鐘舵侊紝鍦ㄥ叿浣撶殑鍚勪釜闃舵涓篃鏈繀鍚堟硶錛堟瘮濡傛湰棰橈紝濡傛灉鏌愪竴琛岀殑鏌愪竴涓綅緗槸'H'錛屼笉鑳芥斁錛岃屾煇涓涓姸鎬佸湪榪欓噷鏀句簡錛屽垯涓嶅悎娉曪級錛屽洜姝よ瀵規瘡涓樁孌靛啀鏋氫婦涓閬嶏紝鎵懼埌鐪熸鍚堟硶鐨勭姸鎬侊紝騫惰鍏ヤ竴涓獀ector錛?br /><3>鎵懼埌鐘舵佽漿縐諱腑鐨勫悎娉曠姸鎬侊細鍦ㄧ姸鎬佽漿縐諱腑錛屽線寰瑕佹眰鐘舵佷笉鍐茬獊錛堟瘮濡傛湰棰橈紝鍦ㄨ繛緇殑涓変釜闃舵涓紝閮戒笉鑳芥湁鏌愪竴浣嶆湁涓や釜涓?鐨勬儏鍐碉級錛屽洜姝わ紝榪樿鏋氫婦姣忎釜鐘舵佸湪杞Щ鏃朵笌鍏朵笉鍐茬獊鐨勭姸鎬侊紝騫惰鍏ector銆?br />娉ㄦ剰錛屾湁鏃跺欒繖涓姝ヤ笉鏄緢瀹規槗榪涜錛岄渶瑕佸湪DP榪囩▼涓繘琛岋紱
錛?錛塂P榪囩▼涓殑綺劇畝錛?br />DP榪囩▼涓紝鏋氫婦鐘舵併佽漿縐誨喅絳栭兘鍙灇涓懼悎娉曠殑錛屽湪vector閲岄潰璋冿紙娉ㄦ剰vector閲岃褰曠殑鍏ㄩ兘鏄姸鎬佺紪鍙瘋屼笉鏄〃紺猴紒錛夛紝鍙互澶уぇ鍑忓皯鏋氫婦閲忥紝涓嶈繃鏈夋椂鍊欙紝榪樹細鏈変竴浜涙椂闂存氮璐癸紝榪欐椂鍊欙紝鍙互閲囧彇涓浜涘叾瀹冪殑鍔炴硶鏉ョ簿綆錛屾瘮濡傚啀嬈¤繘琛孌FS鏋勯犲悎娉曠姸鎬佺瓑銆?br />
鎬諱箣錛岃繖綾婚棶棰樼殑鐩爣灝辨槸“綺劇畝錛岀簿綆錛屽啀綺劇畝錛屼嬌鏋氫婦鍒扮殑涓嶅悎娉曠姸鎬佸噺鍒版渶灝?#8221;銆?br />浠g爜錛?br />
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <vector>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
#define re1(i, n) for (int i=1; i<=n; i++)
#define re2(i, l, r) for (int i=l; i<r; i++)
#define re3(i, l, r) for (int i=l; i<=r; i++)
#define rre(i, n) for (int i=n-1; i>=0; i--)
#define rre1(i, n) for (int i=n; i>0; i--)
#define rre2(i, r, l) for (int i=r-1; i>=l; i--)
#define rre3(i, r, l) for (int i=r; i>=l; i--)
#define pb push_back
#define IR iterator
typedef vector <int> vi;
const int MAXN = 103, MAXM = 11, MAXS = 100, INF = ~0U >> 2;
int n, m, S, A[MAXN], B[MAXS], T1[MAXS], F[MAXN][MAXS][MAXS], res;
bool F0[MAXN][MAXS];
vi P0[MAXN], P1[MAXS][MAXS];
void init()
{
scanf("%d%d", &n, &m); getchar();
re1(i, n) {A[i] = 0; re(j, m) A[i] |= ((getchar() == 'P') << j); getchar();}
}
void dfs(int v, int ST)
{
if (v >= m) B[S++] = ST; else {dfs(v + 3, ST | (1 << v)); dfs(v + 1, ST);}
}
void prepare()
{
S = 0; dfs(0, 0);
re(i, S) {T1[i] = 0; for (int j=B[i]; j; j-=j&(-j)) T1[i]++;}
re1(i, n) re(j, S) if (!(~A[i] & B[j])) {P0[i].pb(j); F0[i][j] = 1;} P0[0].pb(S - 1); F0[0][S - 1] = 1;
re(i, S) re(j, S) if (!(B[i] & B[j])) re(k, S) if (!(B[i] & B[k]) && !(B[j] & B[k])) P1[i][j].pb(k);
}
void solve()
{
re3(i, 0, n) re(j1, S) re(j2, S) F[i][j1][j2] = -INF; F[0][S - 1][S - 1] = 0;
vi::IR vi_e0, vi_e1, vi_e2; int j0, j1, k, V;
re(i, n) {
vi_e0 = P0[i].end(); if (i) vi_e1 = P0[i - 1].end(); else vi_e1 = P0[i].end();
for (vi::IR p=P0[i].begin(); p != vi_e0; p++)
for (vi::IR p_=P0[i ? i - 1 : i].begin(); p_ != vi_e1; p_++) {
j0 = *p; j1 = *p_;
if (!(B[j0] & B[j1])) {
vi_e2 = P1[j0][j1].end();
for (vi::IR p__ = P1[j0][j1].begin(); p__ != vi_e2; p__++) {
k = *p__;
if (F0[i + 1][k]) {
V = F[i][j0][j1] + T1[k];
if (V > F[i + 1][k][j0]) F[i + 1][k][j0] = V;
}
}
}
}
}
res = 0; re(i, S) re(j, S) if (F[n][i][j] > res) res = F[n][i][j];
}
void pri()
{
printf("%d\n", res);
}
int main()
{
init();
prepare();
solve();
pri();
return 0;
}
]]>
銆愪緥1銆?a title="HDU3689" >HDU3689
棰樻剰錛氬瓧絎﹂泦涓湁涓浜涘瓧絎︼紝緇欏嚭姣忎釜瀛楃鐨勫嚭鐜版鐜囷紙瀹冧滑鐨勫拰淇濊瘉涓?錛夛紝鍐嶇粰鍑轟竴涓瓙涓睟錛屾眰錛氫換緇欎竴涓暱搴︿負N鐨勫瓧絎︿覆A錛堝彧鑳藉寘鍚瓧絎﹂泦涓殑瀛楃錛夛紝浣垮緱S鏄疉鐨勫瓙涓茬殑姒傜巼銆?br />
姹傝В榪欑被闂棣栧厛瑕佽繘琛岃ˉ闆嗚漿鍖栥傚洜涓哄瓙涓插彲鑳芥湁閲嶅彔錛堟瘮濡?ababa"涓氨鍑虹幇浜嗕袱涓?aba"錛夛紝鎵浠ュ厛杞寲涓?#8220;姹備換緇欎竴涓暱搴︿負N鐨勫瓧絎︿覆A錛堝彧鑳藉寘鍚瓧絎﹂泦涓殑瀛楃錛夛紝浣垮緱B涓嶆槸A鐨勫瓙涓?/strong>鐨勬鐜?#8221;錛岀劧鍚庡啀鐢?鍑忓幓榪欎釜姒傜巼鍗充負緇撴灉銆?br />璁綟[i][j]涓?#8220;鍦ㄦ墍鏈夐暱搴︿負i鐨?span style="color: red">涓嶅嚭鐜癇鐨勫瓧絎︿覆涓紝鍚庣紑涓嶣鐨勫墠緙鍖歸厤闀垮害涓簀錛堝嵆璇ュ瓧絎︿覆鐨勫悗緙涓嶣鐨勫墠緙鐨?span style="color: red">鏈澶?/strong>鍖歸厤闀垮害涓簀錛夌殑姒傜巼”錛屽緢鏄劇劧錛孎鏄敱閫掓帹寰楀埌浜嗭紝鍏抽敭鏄浣曡繘琛岀姸鎬佽漿縐伙紵鎴栬呰錛屽湪閫掓帹榪囩▼涓紝鍝簺鐘舵佸彲鑳芥垚涓篎[i][j]鐨勫墠瓚嬬姸鎬侊紵
鍋囪F[i-1][k]鏄疐[i][j]鐨勫墠瓚嬬姸鎬侊紝涔熷氨鏄錛?span style="color: red">鍦ㄥ瓧絎﹂泦涓嚦灝戝瓨鍦ㄤ竴涓瓧絎錛屼嬌寰椾富涓茬殑絎琲浣嶏紙鏈鍚庝竴浣嶏級鍙朿鏃訛紝鑳藉浠嶧[i-1][k]杞Щ鍒癋[i][j]銆傝繖灝遍渶瑕佹眰涓涓糞[k][c]錛岃〃紺哄綋涓諱覆鐨勫悗緙涓嶣鐨勫墠緙鐨勶紙鏈澶э級鍖歸厤闀垮害涓簁鏃訛紝鍦ㄤ富涓插悗鍐嶅姞涓婁竴涓瓧絎錛屽叾鍖歸厤闀垮害浼氬彉鎴愪粈涔堛備婦渚嬶細璁劇洰鍓嶄富涓睞'="abasab"錛孊="asabs"錛屽叾鍖歸厤闀垮害涓?錛岃嫢鍦ˋ'鍚庡姞涓婁竴涓瓧絎?s'錛屽垯鍖歸厤闀垮害鍙樹負5錛屾墍浠[4]['s']=5錛岃岃嫢鍦ˋ'鍚庡姞涓婁竴涓瓧絎?a'錛屽垯鍖歸厤闀垮害浼氬彉鎴?錛屾墍浠[4]['a']=1銆傛樉鐒禨鍊煎拰A鍓嶉潰鐨勫摢浜涘瓧絎︽槸娌℃湁鍏崇郴鐨勩?br />閭d箞榪欎釜S鍊煎浣曡綆楋紵鍏跺疄鍙互鍙戠幇錛孲鍜孠MP綆楁硶涓殑nx鏁扮粍紲炰技錛屽洜姝ゅ畬鍏ㄥ彲浠ユ寜鐓ц綆梟x鏁扮粍鐨勫姙娉曟潵璁$畻S銆傚叿浣撴潵璇達紝鍏堣瀵笲浣淜MP鑷韓鍖歸厤錛屾眰鍑哄叾nx鏁扮粍錛岀劧鍚庯紝鍦ㄦ眰S[k][c]鐨勬椂鍊欙紝灝濊瘯鍦˙鐨勭k浣嶏紙鐢變簬B鐨勪笅鏍囦粠0寮濮嬫墍浠[k-1]錛夊悗鍔犱笂瀛楃c錛岀湅鐪嬩細“鍥為”鍒板摢閲屽嵆鍙備唬鐮侊細
re2(i, 1, m) {
while (j && A[i] != A[j]) j = nx[j - 1];
if (A[i] == A[j]) j++;
nx[i] = j;
}
re(i, m) re(k, SZ) {
j = i;
while (j && A[j] != k + 97) j = nx[j - 1];
if (A[j] == k + 97) S[i][k] = ++j; else S[i][k] = 0;
}
浠g爜
銆愪緥2銆?a title="PKU1625" >PKU1625錛?a title="URAL1158" >URAL1158錛?br />棰樻剰錛氱粰鍑轟竴浜涘瓙涓詫紝姹傞暱搴︿負N錛屽悇涓瓧絎﹂兘灞炰簬緇欏畾鐨勫瓧絎﹂泦鐨勬墍鏈夊瓧絎︿覆涓紝涓嶅寘鍚換浣曚竴涓粰鍑虹殑瀛愪覆鐨勫瓧絎︿覆涓暟錛堥渶瑕佷嬌鐢ㄥ帇9浣嶇殑楂樼簿搴︼級銆?br />
鏈鏄劇劧鏄愪緥1銆戠殑澶氬瓙涓插艦寮忥紝鑰岀敤鏉ヨВ鍐沖涓瓧絎︿覆鍚屾椂鍖歸厤鐨勫彧鏈堿C鑷姩鏈猴紝閭d箞濡備綍鍦ㄦ湰棰樹腑浣跨敤AC鑷姩鏈烘眰瑙e憿錛?br />瑙傚療銆愪緥1銆戜腑鐨凢[i][j]錛屽彲浠ユ兂璞′竴涓嬶紝涓涓浘涓湁m涓《鐐癸紝鍒嗗埆琛ㄧず鍖歸厤闀垮害涓?..(m-1)錛岀劧鍚庝笉鏂柊鍔犲叆鐨勫瓧絎﹁榪欎簺鐘舵佸湪榪欎簺緇撶偣闂翠笉鏂漿縐伙紙鐘舵佽漿縐誨氨鏄浘涓殑杈癸級錛岃繖鏍鳳紝F[i][j]灝辮〃紺?#8220;闃舵i鍒拌揪緇撶偣j涓?#8221;銆傝孉C鑷姩鏈烘槸鍩轟簬Trie錛堟爲錛夌殑錛?/span>鍏朵腑鏈夌幇鎴?/span>鐨勭粨鐐癸紝榪欏氨鎻ず浜嗘湰棰樼殑鐘?/span>鎬?/span>錛?/strong>
F[i][j]琛?/span>紺?/span>闀垮害涓篿鐨勫悎娉曠殑瀛楃涓詫紙灝辨槸婊¤凍瀛楃闆嗛檺鍒朵笖涓嶅寘鍚換浣曚竴涓粰瀹氬瓙涓詫級涓紝鍦ㄥ尮閰嶅埌鏈鍚庝竴浣嶏紙絎琲浣嶏級鍚庯紝鍒氬ソ鍒拌揪緇撶偣j鐨勫瓧絎︿覆鐨?/strong>涓暟銆?br />鍚屾牱錛孲[k][c]琛ㄧず“鐩墠鍒拌揪緇撶偣k錛屾帴涓嬫潵鐨勪竴涓瓧絎︽槸c鐨勬椂鍊欙紝浼氬埌杈懼摢涓粨鐐廣傚湪瀵規墍鏈夌殑瀛愪覆寤虹珛浜嗚嚜鍔ㄦ満涔嬪悗錛孲鍊煎彧瑕佺被浼煎湴鎼炲氨鑳芥眰鍑烘潵浜嗐傜劧鍚嶧鐨勮漿縐諱篃灝辨悶瀹氫簡銆?br />涓嶈繃錛屾湰棰樿涓囧垎娉ㄦ剰AC鑷姩鏈虹殑涓涓狟UG錛氬湪寤虹珛浜嗚嚜鍔ㄦ満浠ュ悗錛岄渶瑕佹妸鎵鏈夋湰韜笉鍗遍櫓錛堝鏋滀竴涓粨鐐逛唬琛ㄧ殑瀛楃涓插垰濂芥槸鏌愪竴涓粰鍑虹殑涓嶈兘鍑虹幇鐨勫瓙涓詫紝鍒欒緇撶偣鏄嵄闄╃粨鐐癸級錛屼絾閫氳繃澶辮觸鎸囬拡涓嶆柇涓婃函鑳藉鍒拌揪涓涓嵄闄╃粨鐐圭殑緇撶偣錛屼篃鏍囪涓哄嵄闄╃粨鐐癸紝姣斿涓や釜瀛愪覆鏄?abcde"鍜?bc"錛屽垯浠h〃"abcd"鐨勯偅涓粨鐐圭敱浜庡寘鍚簡"bc"鎵浠ヤ篃鏄嵄闄╃殑銆?br />姝ゅ錛屾湰棰樼殑杈撳叆瑕佹敞鎰忥紝瀛楃闆嗙殑ASCII鐮佽寖鍥存槸-128~127錛屾墍浠ュ繀欏葷敤char鑰屼笉鏄痷nsigned char錛屼笖鐢變簬鍙兘鍖呭惈絀烘牸鎵浠ュ繀欏葷敤gets()鑰屼笉鏄痵canf()杈撳叆錛屽張鍥犱負C/C++涓湪鏈夎礋鏁頒笅鏍囷紝鍥犳鍦ㄨ緭鍏ヤ箣鍚庤繕瑕佽漿鍖栦竴涓嬶紙鍔?28錛夈?br />
浠g爜
銆愪緥3銆?a title="PKU3691" >PKU3691
棰樻剰錛氱粰鍑轟竴浜涘瓙涓插拰涓涓瓧絎︿覆A錛堝叾姣忎釜瀛楃鍧囧睘浜庡瓧絎﹂泦{'A', 'C', 'G', 'T'}錛夛紝姹傝嚦灝戣鏀瑰姩A鐨勫嚑涓瓧絎︼紙涓嶈兘鏀規垚涓嶅睘浜庡瓧絎﹂泦鐨勫瓧絎︼級錛屼嬌寰楀畠涓嶅寘鍚換浣曚竴涓粰鍑虹殑瀛愪覆錛岃嫢涓嶇鎬庝箞鏀歸兘涓嶈錛屽垯緇撴灉涓?1銆?br />
榪欏氨鏄湡姝g殑DP浜嗐傝F[i][j]涓哄墠i浣嶏紝鍒拌揪鐨勭粨鐐逛負j錛屾渶灝戞敼鍔ㄧ殑瀛楃涓暟錛屽垯杞Щ鏂圭▼涓?br />F[i][j] = min{F[i-1][x] + (A[i] != c)}錛宑∈{'A', 'C', 'G', 'T'}錛孲[x][c]=j銆傝竟鐣岋細F[0][root]=0錛屽叾浣欑殑F[0][]=+∞錛孉鐨勫疄闄呬笅鏍囦粠1寮濮嬨?br />姹係鏁扮粍鐨勬柟娉曡銆愪緥2銆?br />
浠g爜
銆愪緥4銆?a title="PKU3208" >PKU3208
棰樻剰錛氬惈鏈夎繛緇殑涓変釜鏁板瓧6鐨勬鏁存暟錛岀О涓?beastly number"錛屾眰絎琍涓紙1<=P<=50000000錛?beastly number"錛堝叾浣嶆暟涓嶄細瓚呰繃15浣嶏級銆?br />錛堣繖棰樻槸鏈矙鑼跺湪PKU涓婅嚦浠婁負姝紝鑷繁鎯沖嚭綆楁硶鐨凙C浜烘暟鏈灝戠殑棰橈級
鏈鍏跺疄鏄敤涓嶇潃KMP鐨勶紝鍥犱負"666"榪欐牱綆鍗曠殑瀛愪覆……
鎬濊礬錛氱敱浜庝綅鏁頒笉浼氳秴榪?5浣嶏紙鍚庢潵鍙戠幇鏈澶氬彧鏈?0浣嶏級錛屾墍浠ユ瘡涓?beastly number"閮藉彲浠ョ湅鎴愪竴涓暱搴︿負15錛屽瓧絎﹂泦涓篬'0'..'9']鐨勫瓧絎︿覆錛堟敞鎰忔槸鍙互鏈夊墠瀵?鐨勶紝鍥犱負浣嶆暟鍙兘涓嶈凍15浣嶏級A錛屾暣涓繃紼嬩篃灝辨槸浠庨珮浣嶏紙絎?浣嶏級鍚戜綆浣嶏紙絎?4浣嶏級姹傚嚭A鐨勫悇浣嶃?br />
棰勫鐞嗭細姹傚嚭F[i][j]錛岃〃紺鴻嫢A鐨勫墠i浣嶅凡緇忕‘瀹氾紙鍏朵腑涓嶅惈"666"錛屽噯紜潵璇存槸闈炴湯灝句笉鍚?666"錛夛紝涓斿墠i浣嶇殑鏈熬鍒氬ソ鏈塲涓?6'錛坖鐨勮寖鍥存槸0鍒?錛夋椂錛屾湁澶氬皯涓?beastly number"錛堟敞鎰忥紝鍓峣浣嶆棦鐒跺凡緇忕‘瀹氾紝灝變笉鍙洿鏀逛簡錛岃兘澶熷喅瀹氱殑鍙湁絎琲浣嶇殑鍚庨潰錛夈?br />鏄劇劧鍏堣姹傚嚭F0[i][j]琛ㄧず鏈夊灝戜釜涓嶆槸"beastly number"銆傚叾閫掓帹鏂圭▼涓嶅ソ鍐欙紝瑙佷唬鐮侊紙鍏跺疄涔熸槸寰堝ソ鐞嗚В鐨勶級銆傜劧鍚嶧[i][j]=1014-i - F0[i][j]銆?br />
鐒跺悗灝辨槸涓嶆柇璋冩暣杈圭晫鏉ユ瀯閫犱簡銆傚噯紜潵璇達紝璁懼墠i-1浣嶅凡緇忕‘瀹氾紝鐜板湪瑕佺‘瀹氱i浣嶏紝鍒欐灇涓劇i浣嶆槸0~9涓殑鍝釜鍊鹼紝鐒跺悗姹傚嚭婊¤凍鏉′歡鐨勬渶灝忕殑"beastly number"鍜屾渶澶х殑"beastly number"鐨勫悕嬈★紙娉ㄦ剰錛屽悕嬈℃槸浠?寮濮嬬殑錛夛紝鐪嬬湅P鍦ㄤ笉鍦ㄥ叾涓紝榪欐牱灝辮兘紜畾浜嗐備弗閲嶆敞鎰忥細濡傛灉宸茬‘瀹氱殑浣嶆暟涓凡緇忓嚭鐜頒簡"666"錛屾帴涓嬫潵鐨勫氨涓嶇敤鏋氫婦浜嗭紝鐩存帴鍦ㄥ悗闈㈡帴涓奝-L灝辮浜嗭紝L涓哄乏杈圭晫銆?br />
浣嗘槸錛屼負浠涔堣鎶婃湰棰樻斁鍦↘MP鐨勪笓棰橀噷闈㈠憿鍥э紵鍥犱負濡傛灉榪欎釜瀛愪覆涓嶆槸"666"鑰屾槸涓浜涚粨鏋勫鏉傜殑涓滀笢姣斿"123131"榪欐牱鐨勶紝鍙湁鍊熷姪KMP綆楁硶浜嗐傝繖鏃訛紝F[i][j]灝辮〃紺?A鐨勫墠i浣嶅凡緇忕‘瀹氾紙闈炴湯灝句笉鍚繖涓瓙涓詫級錛屼笖鍏跺悗緙涓庤繖涓瓙涓茬殑鍓嶇紑鍖?/span>閰嶉暱搴︿負j錛?/span>鏈夊灝戜釜"beastly number" 錛岃漿縐繪柟紼嬩笌鍓嶅嚑涓緥瀛愮被浼箋?br />
浠g爜
鎬葷粨錛?br />KMP綆楁硶鍜孉C鑷姩鏈虹殑鐘舵佽漿縐繪ц川鍐沖畾浜嗗畠浠湪瀛楃涓插尮閰嶇被DP闂涓殑宸ㄥぇ浣滅敤銆傚湪瀹為檯搴旂敤涓紝瑕佹敞鎰忕伒媧諱嬌鐢ㄥ畠浠傛澶栵紝AC鑷姩鏈虹殑閭d釜BUG鏄竴瀹氳娉ㄦ剰鐨勩?
]]>
鏈矙鑼惰榪囩殑鏈鐚ョ悙鐨凞P棰樺晩鍟婂晩鍟婂晩鍟婂晩鍟婂晩鍟婂晩鍟婂晩鍟婂晩鍟婂晩鍟婂晩鍟?#8230;…
璁綟[i]涓哄皢A[1..i]鎷嗗垎鎴愯嫢騫叉鐨勬渶澶у兼渶灝忓拰錛屽垯鏈?br />F[i]=min{F[j] + max[j+1, i]}錛圔[i]<=j<i錛夛紝鍏朵腑max[j+1, i]琛ㄧずA[j+1..i]涓殑鏈澶у鹼紝B[i]琛ㄧず浠巌鍚戝乏鏈榪滃彲浠ュ歡浼稿埌鍝噷錛堜篃灝辨槸婊¤凍SUM[x..i]<=m鐨勬渶灝忕殑x鍊鹼級銆侭鏁扮粍鍙互閫氳繃棰勫鐞嗗湪O(N)鏃墮棿鍐呭緱鍒般?br />杈圭晫錛欶[0]=0銆?br />
涓嬮潰鏄紭鍖栬繃紼嬨侸ZP紲炵妵鐨勮鏂囬噷闈㈠凡緇忓璇︾粏浜嗐傝繖閲屽彧鏄畝瑕佽鏄庝竴涓嬨?br />棣栧厛瀹規槗璇佹槑錛孎鏄崟璋冮掑鐨勩?br />鐒跺悗涓涓緢鍏抽敭鐨勫畾鐞嗘槸錛?strong style="color: red">鑻[i]鐨勬渶浼樺喅絳栦負j錛屽垯鏈堿[j]>∀A[k]錛坖<k<=i錛夈?/strong>
璇佹槑錛氱敤鍙嶈瘉娉曘傝嫢A[j+1..i]涓瓨鍦ㄤ笉灝忎簬A[j]鐨勫鹼紝鍒欏彲寰梞ax[j..i]=max[j+1..i]錛屽張鍥犱負F鍗曡皟閫掑錛屾墍浠[j-1]+max[j..i]<=F[j]+max[j+1.i]錛屽嵆鍐崇瓥(j-1)涓瀹氫笉姣斿喅絳杍宸紝涔熷氨鏄喅絳杍涓嶅彲鑳芥垚涓烘渶浼樺喅絳栥?br />榪欐牱錛屽彲浠ョ淮鎶や竴涓笅鏍囦弗鏍奸掑銆丄鍊間弗鏍奸掑噺鐨勯槦鍒桻錛堝嵆瀵逛簬闃熷垪涓殑浠繪剰涓や釜鍏冪礌Q[i]鍜孮[j]錛岃嫢i<j錛屽垯Q[i].pos<Q[j].pos涓擜[Q[i].pos]>A[Q[j].pos]錛屽叿浣撳疄鐜版椂pos鍙渷鐣ワ級銆傚垯鍙兘鎴愪負鏈浼樺喅絳栫殑鍐崇瓥瑕佷箞鏄湪榪欎釜闃熷垪Q閲岋紝瑕佷箞鏄疊[i]銆傚浜庨槦鍒椾腑鐨勬煇涓喅絳朡[x]錛岃鍐崇瓥瀵煎嚭鐨勫間負F[Q[x]]+A[Q[x + 1]]錛堝緢瀹規槗璇佹槑max[Q[x]+1..i]=A[Q[x + 1]]錛夛紝鎵懼埌榪欎簺瀵煎嚭鐨勫間腑鐨勬渶灝忓煎嵆鍙紙娉ㄦ剰錛岄槦灝懼厓绱犳病鏈夊鍑哄鹼級銆傚浜庡喅絳朆[i]錛屽彧闇瑕佸湪棰勫鐞嗙殑鏃跺欏悓鏃跺緱鍒癕AX[i]=max[B[i]+1..i]鍗沖彲錛堜篃鍙互鍦∣(N)鏃墮棿鍐呭緱鍒幫級錛屽喅絳朆[i]瀵煎嚭鐨勫間負F[B[i]]+MAX[i]銆?br />鍦ㄥ垹闄ら槦棣栬繃鏃跺厓绱犵殑鏃跺欙紝闇瑕佹妸瀵煎嚭鍊間篃鍒犻櫎錛屽垹闄ら槦灝懼厓绱犱篃涓鏍鳳紝鎻掑叆鐨勬椂鍊欙紝鑻ユ彃鍏ュ墠闃熷垪涓嶄負絀猴紝鍒欓渶瑕佹彃鍏ヤ竴涓鍑哄箋備篃灝辨槸錛岄渶瑕佷竴涓敮鎸佸湪瀵規暟鏃墮棿鍐呰繘琛屾彃鍏ャ佸垹闄や換鎰忕粨鐐廣佹壘鏈灝忓肩瓑鎿嶄綔錛屾樉鐒剁敤騫寵 鏍戞渶濂姐?br />
娉ㄦ剰浜嬮」錛?br />錛?錛変笉綆℃槸鍦ㄩ槦棣栧垹闄よ繕鏄湪闃熷熬鍒犻櫎錛岃嫢鍒犻櫎鐨勬槸闃熷垪涓殑鏈鍚庝竴涓厓绱狅紝鍒欎笉闇瑕佸湪騫寵 鏍戜腑鍒犻櫎瀵煎嚭鍊鹼紱
錛?錛夋彃鍏ユ椂錛岃嫢鎻掑叆鍓嶉槦鍒椾負絀猴紝鍒欎笉闇瑕佸湪騫寵 鏍戜腑鎻掑叆瀵煎嚭鍊鹼紱
錛?錛夊湪璁$畻F[i]鏃訛紝搴斿厛灝嗗喅絳杋鍘嬪叆銆?br />
浠g爜錛?
#include <stdio.h>
using namespace std;
#define re1(i, n) for (int i=1; i<=n; i++)
const int MAXN = 100001;
struct node {
int l, r, p, sz0, sz, mul;
long long v;
} T[MAXN];
const long long INF = ~0Ull >> 2;
int n, N = 0, a[MAXN], b[MAXN], MAX[MAXN], Q[MAXN], front = 0, rear = -1, root = 0;
long long m, F[MAXN], res = 0;
void init()
{
cin >> n >> m;
re1(i, n) scanf("%d", &a[i]); a[0] = ~0U >> 2;
}
void prepare()
{
re1(i, n) if (a[i] > m) {res = -1; return;}
int x = 1;
long long sum = 0;
re1(i, n) {
for (sum+=a[i]; sum>m; sum-=a[x++]) ;
b[i] = x - 1;
}
re1(i, n) {
for (; front<=rear && Q[front]<=b[i]; front++) ;
for (; front<=rear && a[Q[rear]]<=a[i]; rear--) ;
Q[++rear] = i; MAX[i] = a[Q[front]];
}
}
void vst(int x)
{
if (x) {
cout << T[x].v << ' ';
vst(T[x].l); vst(T[x].r);
}
}
void slc(int _p, int _c)
{
T[_p].l = _c; T[_c].p = _p;
}
void src(int _p, int _c)
{
T[_p].r = _c; T[_c].p = _p;
}
void upd(int x)
{
T[x].sz0 = T[T[x].l].sz0 + T[T[x].r].sz0 + T[x].mul;
T[x].sz = T[T[x].l].sz + T[T[x].r].sz + 1;
}
void lrot(int x)
{
int y = T[x].p;
if (y == root) T[root = x].p = 0; else {int p = T[y].p; if (y == T[p].l) slc(p, x); else src(p, x);}
src(y, T[x].l); slc(x, y); T[x].sz0 = T[y].sz0; T[x].sz = T[y].sz; upd(y);
}
void rrot(int x)
{
int y = T[x].p;
if (y == root) T[root = x].p = 0; else {int p = T[y].p; if (y == T[p].l) slc(p, x); else src(p, x);}
slc(y, T[x].r); src(x, y); T[x].sz0 = T[y].sz0; T[x].sz = T[y].sz; upd(y);
}
void maintain(int x, bool ff)
{
int z;
if (ff) {
if (T[T[T[x].r].r].sz > T[T[x].l].sz) {z = T[x].r; lrot(z);}
else if (T[T[T[x].r].l].sz > T[T[x].l].sz) {z = T[T[x].r].l; rrot(z); lrot(z);} else return;
} else {
if (T[T[T[x].l].l].sz > T[T[x].r].sz) {z = T[x].l; rrot(z);}
else if (T[T[T[x].l].r].sz > T[T[x].r].sz) {z = T[T[x].l].r; lrot(z); rrot(z);} else return;
}
maintain(T[z].l, 0); maintain(T[z].r, 1); maintain(z, 0); maintain(z, 1);
}
int find(long long _v)
{
int i = root;
long long v0;
while (i) {
v0 = T[i].v;
if (_v == v0) return i; else if (_v < v0) i = T[i].l; else i = T[i].r;
}
return 0;
}
int Find_Kth(int K)
{
int i = root, s0, m0;
while (1) {
s0 = T[T[i].l].sz0; m0 = T[i].mul;
if (K <= s0) i = T[i].l; else if (K <= s0 + m0) return i; else {K -= s0 + m0; i = T[i].r;}
}
}
void ins(long long _v)
{
if (!root) {
T[++N].v = _v; T[N].l = T[N].r = T[N].p = 0; T[N].sz0 = T[N].sz = T[N].mul = 1; root = N;
} else {
int i = root, j;
long long v0;
while (1) {
T[i].sz0++; v0 = T[i].v;
if (_v == v0) {T[i].mul++; return;} else if (_v < v0) j = T[i].l; else j = T[i].r;
if (j) i = j; else break;
}
T[++N].v = _v; T[N].l = T[N].r = 0; T[N].sz0 = T[N].sz = T[N].mul = 1; if (_v < v0) slc(i, N); else src(i, N);
while (i) {T[i].sz++; maintain(i, _v > T[i].v); i = T[i].p;}
}
}
void del(int x)
{
if (T[x].mul > 1) {
T[x].mul--; while (x) {T[x].sz0--; x = T[x].p;}
} else {
int l = T[x].l, r = T[x].r, p;
if (l && r) {
int y; while (y = T[l].r) l = y;
T[x].v = T[l].v; T[x].mul = T[l].mul; p = T[l].p;
if (l == T[p].l) slc(p, T[l].l); else src(p, T[l].l);
while (p) {upd(p); p = T[p].p;}
} else {
if (x == root) T[root = l + r].p = 0; else {p = T[x].p; if (x == T[p].l) slc(p, l + r); else src(p, l + r); while(p) {upd(p); p = T[p].p;}}
}
}
}
long long h(int x)
{
return F[Q[x]] + a[Q[x + 1]];
}
void solve()
{
F[0] = 0; front = 0; rear = 0; Q[0] = 0;
re1(i, n) {
for (; front<=rear && Q[front]<b[i];) {if (front < rear) del(find(h(front))); front++;}
for (; front<=rear && a[Q[rear]]<=a[i];) {if (front < rear) del(find(h(rear - 1))); rear--;}
Q[++rear] = i; if (front < rear) ins(h(rear - 1));
if (root) F[i] = T[Find_Kth(1)].v; else F[i] = INF;
if (F[b[i]] + MAX[i] < F[i]) F[i] = F[b[i]] + MAX[i];
}
res = F[n];
}
void pri()
{
cout << res << endl;
}
int main()
{
init();
prepare();
if (!res) solve();
pri();
return 0;
}
]]>
棣栧厛鐪嬩竴涓嬪閲嶈儗鍖呴棶棰樼殑鏈寸礌杞Щ鏂圭▼錛?br />F[i][j] = max{F[i-1][j-x*w[i]]+x*v[i]} (0<=x<=s[i], j>=x*w[i])
濡傛灉浣跨敤婊氬姩鏁扮粍錛屽拷鐣榪欎竴緇達紝璁緒0=w[i]錛寁0=v[i]錛宻0=s[i]錛屽緱錛?br />F[j] = max{F[j-x*w0]+x*v0} (0<=x<=s0, j>=x*w0)
鐪嬩笂鍘昏繖鍜屽崟璋冮槦鍒楁湪鏈夌椹叧緋伙紝鍥犱負鍐崇瓥涓嬫爣錛坖-x*w0錛変笉鏄竴涓暣鏁板尯闂達紝涓棿鏄湁闂撮殧鐨勩傜劧鑰屽彲浠ュ彂鐜幫紝榪欎釜鏂圭▼鐨勯檺鍒舵潯浠?#8220;0<=x<=s0錛宩>=x*w0”錛屼篃灝辨槸x鐨勪笅鐣屾槸max{0, j/w0錛堜笅鍙栨暣錛墋錛屽綋j鍗曡皟閫掑鏃訛紝榪欎釜涓嬬晫涔熸槸鍗曡皟閫掑鐨勩傝繖婊¤凍鍗曡皟闃熷垪浼樺寲鐨勬潯浠朵腑鐨?#8220;鍐崇瓥涓嬫爣鐨勪笅鐣屽崟璋?#8221;……涓嶆槸錛岃繕涓嶈兘榪欐牱璇達紝鍥犱負榪欓噷鐨勫喅絳栦笅鏍囨槸j-x*w0錛岃屼笉鏄痻銆?br />閭d箞鎬庢牱鎵嶅彲浠ユ妸鍐崇瓥涓嬫爣鍙樹負x錛?br />
灝嗗喅絳栦笅鏍囨寜鐓фāw0鐨勪綑鏁拌繘琛屽垎綾伙紝鍙互鍒嗘垚w0綾伙紝鍒嗗埆瀵瑰簲妯0浣?銆佷綑1……浣?w0-1)鐨勬儏鍐點傝繖鏃訛紝涓婇潰鏂圭▼涓殑鎵鏈夊喅絳栦笅鏍噅-x*w0閮芥槸鍚屼竴綾葷殑銆傝繘涓姝ワ紝璁緌 =j/w0錛堜笅鍙栨暣錛夛紝r=j%w0錛屽垯j=q*w0+r錛屽浜庢煇涓喅絳栦笅鏍噅'錛岃k=(j'-r)/w0錛屽嵆j'=k*w0+r銆傛樉鐒跺彲浠ュ彂鐜幫紝k鐨勫彇鍊艱寖鍥存槸錛歬>=0涓攓-s0<=k<=q錛屼篃鍗砶鐨勪笅鐣屾槸max{0, q-s0}——闅廽鐨勫崟璋冭屽崟璋冦?br />鐒跺悗錛岃漿縐繪柟紼嬪彲浠ユ敼涓猴紙榪欓噷鎶妑褰撴垚涓涓凡鐭ラ噺浜嗭級錛?br />F[q*w0+r] = max{F[k*w0+r]+(q-k)*v0} (k>=0涓攓-s0<=k<=q)
鍗矲[q*w0+r]=max{F[k*w0+r]-k*v0}+q*v0 (k>=0涓攓-s0<=k<=q)
璁綠[k]=F[k*w0+r]寰楋細
G[q]=max{G[k]-k*v0}+q*v0 (k>=0涓攓-s0<=k<=q)
榪欎釜鏂圭▼宸茬粡鍙互浣跨敤鍗曡皟闃熷垪鏉ヤ紭鍖栦簡錛?br />
榪欐牱鍙互寰楀嚭綆楁硶錛?br />錛?錛変粠1鍒皀錛屾灇涓緄錛屽緩绔媤[i]涓┖鐨勫崟璋冮槦鍒楋紝姣忎釜闃熷垪鐨勫厓绱犻兘鏄袱涓猧nt鍊鹼細(k, val)錛岃〃紺鴻漿鎹㈠悗涓嬫爣鍜屽喅絳栧?G[k]-k*v[i])錛?br />錛?錛変粠0鍒癿錛屾灇涓緅錛屽緱鍑簈銆乺鐨勫鹼紝瀵逛簬闃熷垪r錛?br />銆?銆戝垹鍘婚槦棣栬繃鏃訛紙k<q-m[i]錛夌殑鍏冪礌錛?br />銆?銆慒[j]鍏ラ槦錛堣繖閲岀殑F[j]鎸囦笂涓闃舵鐨凢[j]錛屽嵆F[i-1][j]銆傚洜姝よ繖涓姝ユ搷浣滀竴瀹氳鍏堣繘琛岋級錛屽垹鍘婚槦灝炬墍鏈夊喅絳栧紇al涓嶅ぇ浜?F[j]-q*v[i])鐨勫厓绱犮?br />銆?銆戝彇鍑洪槦棣栫粨鐐癸紝鍏秜al鍊煎姞涓妐*v[i]鍚庡嵆涓烘湰闃舵F[j]鐨勫箋?br />鏈鍚嶧[m]鍗充負緇撴灉銆傛繪椂闂村鏉傚害涓篛(NM)銆?br />
鍏跺疄榪欎釜鏄彲浠ユ帹騫跨殑錛屽嵆瀵逛簬濡備笅褰㈠紡鐨勮漿縐繪柟紼嬶紙鍏朵腑H銆丟鍜學鍧囦負甯擱噺錛孊[i]涓哄喅絳栦笅鏍囩殑涓嬬晫錛岄殢i鍗曡皟錛夛細
F[i] = opt{F[i-x*H+W]}+G (B[i]<=i-x*H+W<i錛寈∈N錛?br />閮藉彲浠ョ敤涓婅堪鐨勫姙娉曡繘琛岃漿鍖栵紝浠庤岃繘琛屽崟璋冮槦鍒椾紭鍖栥?br />
]]>