锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
2013騫寸涓棰?#8230;…綰康涓涓?#8230;…
璁綟[i][j]琛ㄧず鍧恑嬈$數(shù)姊埌杈炬埧闂磈錛屾渶澶氳兘鍒板嚑妤鹼紝鍒欐湁
F[i][j]=max{F[i-1][k]+W[k][j]}, 0<=k<n錛?br />榪欓噷W(xué)[k][j]瑕佹敞鎰忥紝濡傛灉涓嶅瓨鍦ㄤ粠k鍒癹鐨勭數(shù)姊紝W(xué)[k][j]搴旇涓?INF銆?br />榪欎釜鏂圭▼鏄劇劧鏄彲浠ョ敤鐭╅樀涔樻硶鏉ヤ紭鍖栫殑銆?br />鐒跺悗錛岄棶棰樺氨鏄眰鍑烘渶灝忕殑i浣垮緱F[i]鐨勭姸鎬佷腑鏈夊?gt;=M鐨勶紝榪欎釜鍙互浜屽垎錛堟瘡嬈$湅褰撳墠瑙d笌W鐨?2^K-1)嬈℃柟鐨勮繍綆楃粨鏋滐紝鑻ユ湁瑙e垯瀹為檯涓嶈繘琛岃繖嬈¤繍綆楋紝鍚﹀垯涓嶹鐨?^K嬈℃柟榪愮畻錛?#8230;…鎬繪椂闂村鏉傚害鏄疧(n3logM)鐨勶紝瀵逛簬鏈鍙兘瑕佽繘琛屼竴浜涘父鏁頒紭鍖栨墠鑳借繃錛?0涓偣錛屾瘡涓偣5涓暟鎹紝鐩稿綋浜?00涓偣錛屾椂闄愬彧鏈?0s錛夛紝鍙嶆鏈矙鑼舵槸鍗$嚎榪囩殑銆?br />
浣嗘槸錛屾湰棰樻湁涓涓粏鑺傚緢閲嶈錛屽繀欏昏璇翠竴涓嬶紙鍥犱負(fù)鏈矙鑼跺湪榪欓噷鍗′簡1h+錛?#8230;…閭e氨鏄孩鍑洪棶棰?#8230;…
F[i][j]鐨勫兼槸鏈夊彲鑳借秴榪噇ong long鐨勮寖鍥寸殑錛岀劧鑰屽鏋滅‖鍔犻珮綺懼害鐨勮瘽紼砊錛岃繖鏃訛紝鍦ㄨ繘琛岀煩闃典箻娉曪紙瀹為檯鏄姞娉曪級鐨勬椂鍊欙紝闇瑕佺壒鍒や竴涓嬶紝濡傛灉榪欎釜鍜岃秴榪囦簡INF錛圛NF鏄瘇0Ull>>2錛?gt;1018錛夛紝灝卞彇INF銆傝繖鏍峰彲鑳戒細(xì)鐮村潖緇撳悎寰嬶紝浣嗘槸鏈ㄦ湁浜嬶紝鍥犱負(fù)鑻ヤ袱涓姞鏁伴兘鏄潪璐熸暟錛屽垯涓嶄細(xì)鐮村潖錛岃嫢鏈夎礋鏁幫紝鍒欎竴瀹氳〃紺烘棤瑙o紙-INF錛夛紝榪欎釜鐗瑰垽涓涓嬪氨琛屼簡錛堣嫢涓や釜鍔犳暟涔嬩腑鏈夎礋鏁幫紝鍒欑粨鏋滃彇-INF錛夈?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 = 110, MAXLEN = 61;
const ll INF = ~0Ull >> 2;
int n;
ll M, A[MAXLEN][MAXN][MAXN], W0[MAXN][MAXN], _[MAXN][MAXN], res;
void mult(ll A0[][MAXN], ll B0[][MAXN])
{
re(i, n) re(j, n) _[i][j] = -INF; ll __;
re(i, n) re(j, n) re(k, n) if (A0[i][k] >= 0 && B0[k][j] >= 0) {
__ = A0[i][k] + B0[k][j];
if (__ > INF) __ = INF;
if (__ > _[i][j]) _[i][j] = __;
}
}
void prepare()
{
re2(i, 1, MAXLEN) {
mult(A[i - 1], A[i - 1]);
re(j, n) re(k, n) A[i][j][k] = _[j][k];
mult(A[i], A[0]);
re(j, n) re(k, n) A[i][j][k] = _[j][k];
}
}
void solve()
{
re(i, n) re(j, n) if (i == j) W0[i][j] = 0; else W0[i][j] = -INF; bool FF; res = 0;
rre(i, MAXLEN) {
FF = 0; re(j, n) if (A[i][0][j] >= M) {FF = 1; break;}
if (FF) continue;
mult(W0, A[i]);
FF = 0; re(j, n) if (_[0][j] >= M) {FF = 1; break;}
if (!FF) {
re(j, n) re(k, n) W0[j][k] = _[j][k];
mult(W0, A[0]);
re(j, n) re(k, n) W0[j][k] = _[j][k];
res += 2ll << i;
}
}
FF = 0; re(i, n) if (W0[0][i] >= M) {FF = 1; break;}
if (!FF) res++;
}
int main()
{
int tests;
scanf("%d", &tests);
re(testno, tests) {
cin >> n >> M;
re(i, n) re(j, n) {scanf("%lld", &A[0][i][j]); if (!A[0][i][j]) A[0][i][j] = -INF;}
prepare();
solve();
cout << res << endl;
}
return 0;
}
]]>
棰勫鐞嗭細(xì)璁綟[i]涓轟互i寮澶寸殑鏈闀夸笂鍗囧簭鍒楃殑闀垮害錛屾庝箞姹備笉鐢ㄨ浜嗗惂鍥?#8230;…
鍋囪鐩墠闇瑕佹眰闀垮害涓篗鐨勩佹爣鍙峰瓧鍏稿簭鏈灝忕殑涓婂崌搴忓垪錛屾樉鐒跺叾絎竴涓厓绱燗[i]蹇呴』婊¤凍F[i]>=M錛堟敞鎰忥紝涓嶆槸絳変簬錛屾槸澶т簬絳変簬錛侊級錛屾壘鍒版弧瓚寵繖涓潯浠剁殑鏈灝忕殑i鍗沖彲銆傜劧鍚庯紝璁劇洰鍓嶅凡緇忔眰鍑轟簡璇ュ簭鍒楃殑絎瑇涓厓绱犱負(fù)A[y]錛屽垯絎?x+1)涓厓绱燗[z]闇瑕佹弧瓚崇殑鏉′歡鏄疉[z]>A[y]錛屼笖F[z]=F[y]-1錛屾壘鍒版弧瓚寵繖涓潯浠剁殑鏈灝忕殑z鍗充負(fù)璇ュ簭鍒楃殑絎?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]鐨勬渶浼樹慨鏀規(guī)柟妗堝繀鐒舵槸灝咥[j+1..t]鍏ㄩ儴淇敼涓篈[j]錛孉[t+1..i]鍏ㄩ儴淇敼涓篈[i]錛岃繖閲宼鏄竴涓猍j..i]鑼冨洿鐨勫箋傞棶棰樺氨鏄浣曟眰鍑烘渶浼樼殑t錛?br />涓寮濮嬶紝鍋囪t=j錛屽嵆鎶夾[j+1..i-1]鍏ㄩ儴淇敼涓篈[i]錛岃綆楀嚭淇敼閲忥紝璁句負(fù)S銆傜劧鍚庯紝鐢變簬A[j+1..i-1]涔嬮棿鐨勫厓绱犺涔堝皬浜嶢[j]錛岃涔堝ぇ浜嶢[i]錛堣繖涓槸鏄劇劧鐨勫洤錛夛紝鎴戜滑鎶婂皬浜嶢[j]鐨勫厓绱犵О涓?#8220;灝忔暟”錛屾妸澶т簬A[i]鐨勫厓绱犵О涓?#8220;澶ф暟”錛屽垯褰搕鍙杢0鏃訛紝淇敼閲忎負(fù)S-(A[i]-A[j])*(A[j+1..t0]涓殑“灝忔暟”涓暟鍑忓幓“澶ф暟”涓暟錛夈傝繖鏍鳳紝鍙渶鎵弿涓涓嬶紝姹傚嚭浣垮緱(A[j+1..t0]涓殑“灝忔暟”涓暟鍑忓幓“澶ф暟”涓暟錛夊兼渶澶х殑t0鍗沖彲銆?br />褰撶劧榪樻湁涓涓棶棰橈紝瀵逛簬鍚屼竴涓猧錛屾弧瓚?#8220;A[j]<=A[i]涓擣[j]=F[i]-1”鐨勫厓绱犱釜鏁板彲鑳芥湁寰堝錛屽鏋滀竴涓竴涓灇涓撅紝涓涓竴涓壂鎻忥紝浼?xì)寰堟參鐨勫?#8230;…瑙e喅鏂規(guī)硶鏄紝姹傚嚭婊¤凍榪欎釜鏉′歡鐨刯涓渶灝忕殑涓涓紝璁句負(fù)j0錛岀劧鍚庢妸A[j0+1..i-1]涓殑鎵鏈?#8220;灝忔暟”鍜?#8220;澶ф暟”鍏ㄩ儴澶勭悊鍑烘潵錛岀劧鍚庣敤綾諱技鍓嶇紑鍜岀殑鏂規(guī)硶灝辮兘鎼炰簡鍥?#8230;…褰撶劧錛屼負(fù)浜嗘壘鍒癹0錛岄渶瑕佸緩涓涓簩鍒嗗浘錛岃竟涓?F[i], i)銆?br />鏈鍚庯紝涓轟簡鏂逛究錛屽彲浠ユ妸A搴忓垪鐨勫乏杈瑰姞涓涓?INF錛屽彸杈瑰姞涓涓?INF銆傛渶鍚庢葷殑鏃墮棿澶嶆潅搴︼紝鐞嗚涓婁負(fù)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;
}
]]>
]]>
DP棰橈紝鍐欒搗鏉ユ瘮杈冪箒鐞?#8230;…
棣栧厛杞Щ鏂圭▼鏄笉闅炬兂鐨勫洤……F[i][j]錛岃〃紺篿鏃墮棿鍚庤兘鍔涗負(fù)j錛?br />鐒跺悗瑕佽涓浜涜緟鍔╂暟緇勶紝G[i]琛ㄧずF[i][1..MAXJ]鐨勬渶澶у鹼紝H2[i]琛ㄧず鑳藉姏涓嶈秴榪噄鐨勪竴嬈℃粦闆殑鏈灝忔椂闂達(dá)紙榪欎釜榪樿鐢ㄤ竴涓狧1[i]琛ㄧず鑳藉姏鍒氬ソ涓篿鐨勬潵杈呭姪姹傚嚭錛?#8230;…
鍓╀笅鐨勪篃灝卞偦鎺変簡錛?br />褰撶劧錛學(xué)JMZBMR紲炵妵鐢ㄨ蹇嗗寲鎼滅儲……鐪佸幓浜嗕竴浜涜綆楅噺……鏈夋晥緙╃煭鏃墮棿……Orz鍟?#8230;…
錛堝叾瀹烇紝濡傛灉澶у鏁扮姸鎬侀兘鏄棤鏁堢姸鎬佹垨鑰呮牴鏈涓嶅嚭鏈浼樿В鐨勭姸鎬侊紝鍙互鐢ㄨ蹇嗗寲鐨?#8230;…錛?br />浠g爜
銆?銆?a title="BZOJ1572" >BZOJ1572
浠誨姟璋冨害闂錛堣椽蹇冩ā鍨嬶級鐨勫姞寮虹増錛岀敤鍫嗕紭鍖栧洤……
鍏堟妸鎵鏈夌殑浠誨姟鎸夌収緇撴潫鏃墮棿閫掑噺鎺掑簭錛岀劧鍚庢壂鎻忥紝瀵逛簬褰撳墠浠誨姟A[i]錛岀粨鏉熸椂闂翠負(fù)T[i]錛屼笂涓涓換鍔[i-1]鐨勭粨鏉熸椂闂翠負(fù)T[i-1]錛岃D=T[i-1]-T[i]錛屽垯鍦ㄥ爢涓彇鍑烘敹鐩婃渶澶х殑D涓換鍔★紙鏄劇劧璇ュ爢鏄互鏀剁泭涓哄叧閿瓧鐨勫ぇ欏跺爢錛夛紝鐢ㄥ畠浠~涓奫T[i]+1, T[i-1]]榪欎釜鏃墮棿孌碉紙鍘熷洜寰堢畝鍗曪紝A[i]鍙?qiáng)浠ュ悗鐨勪徽d姟鍦═[i]鏃跺埢浠ュ墠灝辯粨鏉熶簡錛屼笉鑳芥彃鍏ュ埌姝ゆ鍐咃紝鍥犳姝ゆ鍐呭彧鑳芥彃鍏[i-1]鍙?qiáng)鍏朵互鍓嶇殑锛屼篃灏辨槸鍦ㄥ爢涓殑鋼Q鍔★級錛岃嫢鍫嗕腑鐨勪換鍔℃暟<D錛屽垯鍏ㄩ儴鍙栧嚭錛岃繘琛屽畬榪欎竴姝ュ悗錛屽啀灝咥[i]鎻掑叆鍒板爢涓嵆鍙?br />鎬繪椂闂村鏉傚害錛歄(NlogN)錛?br />浠g爜
銆?銆?a title="BZOJ1574" >BZOJ1574
寰堝鏄撴兂鍒版渶灝忕偣鍓詫紙鎬庝箞鐪嬫庝箞鍍忓洤錛夛紝浣嗗畠鍜屾渶灝忕偣鍓插張涓嶄竴鏍鳳紝鍥犱負(fù)鏈鏄眰T閮ㄥ垎鐐規(guī)暟鏈灝戠殑鐐瑰壊……
姝hВ浠嶇劧鏄椽蹇冦傚浜庢瘡涓姤鍛婄偣錛岀敱浜庡畠娌″潖涓斿埌1娌℃湁鍙粡榪囨湭鍧忕偣鐨勮礬寰勶紝鎵浠ヤ笌瀹冪浉閭?cè)潥勬墍鏈夌殑鐐硅涔堟槸鍧忕偣錛岃涔堝埌1涔熸病鏈夎礬寰勶紝鍥犳鍙互璁や負(fù)瀹冧滑閮芥槸鍧忕偣錛堝湪鏈浼樻柟妗堜腑涓瀹氭槸榪欐牱錛夛紝榪欐牱鏍囪鍑烘墍鏈夌殑鍧忕偣浠ュ悗錛屼粠1寮濮嬪仛涓嬈¢亶鍘嗭紙鍙粡榪囨湭鍧忕偣鐨勶級錛屾渶緇堢粨鏋滃氨鏄亶鍘嗗埌鐨勭偣鏁幫紱
浠g爜
銆?銆?a title="BZOJ1575" >BZOJ1575
瑁哥殑DP棰樺晩鍟?#8230;…鍏抽敭鏄湰娌欒尪WA浜哊嬈¤繕鐢ㄦ毚鎼滀唬鐮佹潵瀵規(guī)媿鍟婂晩……琚姌紓ㄦ浜嗗晩鍟?#8230;…
綆鍗曡涓涓嬫槗鐤電偣錛?br /><1>涓嶅彲鎶婁袱杈歸兘鍔犱笂涓涓?鏉ョ畝鍖栵紝鍥犱負(fù)鍓嶄袱鏉★紙澶勭悊涓よ竟鐨勶級瑙勫垯鍜屽姞涓?涔嬪悗鐨勫茍涓嶇瓑浠鳳紱
<2>娉ㄦ剰杈圭晫鐐癸紙i=0鎴杍=1鏃訛級鐨勬儏鍐碉紱
<3>娉ㄦ剰鏈緇堢粨鏋滐紝瑕佸湪F[0..N-1]涓壘鏈灝忕殑鍚堟硶鐨刯鑰屼笉鏄彧鍦‵[N-1]涓壘錛?br />浠g爜
]]>