锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
鏄懼崱榪樻槸澶瀮鍦鋸︹?絳夋斁鍋囧幓瀹鵑鍗鎬竴涓洖鏉ワ紒錛佲︹︼紙鏈夌偣涓嶅ソ鐨勮錛?/font>
1G鐨勫唴瀛橈紝鍗犵敤閲忎竴鐩村湪54%宸﹀彸銆傜‘瀹炲緢鍚冪‖浠躲?/font>
涓嬪崍鏄暟瀛︾殑涓浜涗笢瑗褲?/p>
濂旀祦銆?/p>
鏈潵鏄疎VA鐨勪竴涓悓浜哄皬璇淬佹煇緗戝弸鐨処D銆傜幇鍦ㄧ獊鐒舵湁榪欑鎰熻浜嗐?/p>
浜斿ぉ鐨勯泦璁紝鐜板湪絎笁澶╁氨瑕佺粨鏉熶簡錛屾槑澶╁氨鏄?鍙楓?/p>
4鍙鳳紝5鍙鳳紝6鍙峰洖涓滃尯銆傜劧鍚庣寷琛ユ枃鍖栬錛屽啀鏈変竴涓湀錛屽氨寮濮嬫渶鍚庣殑鍑嗗浜嗐?/p>
11鏈?1鏃ワ紝涓婃垬鍦虹殑鏃ュ瓙銆?/p>
涓轟簡瀹濊礉鍎匡紝涓轟簡鎴戣嚜宸便?/p>
涓嬪崍寮濮嬩簡鎼滅儲錛屾湁鐐規檿銆?/p>
鏅氫笂濂藉ソ浼戞伅銆?/p>
緇欎竴媯祅涓粨鐐圭殑鏍戯紝緇欐瘡涓偣瀹夋帓涓涓鏁存暟緙栧彿錛屼嬌寰楃浉閭葷偣鍏鋒湁涓嶅悓鐨勭紪鍙鳳紝緙栧彿鐨勬誨拰灝介噺灝忋?br>銆愯緭鍏ャ?br>絎竴琛岋細n(n<=50,000)
浠ヤ笅n-1琛岋紝姣忚涓や釜鏁皍,v(1<=u,v<=n)錛岃〃紺簎 鍜寁鏈変竴鏉¤竟
銆愯緭鍑恒?br>浠呬竴琛岋紝涓烘渶灝忕紪鍙峰拰
銆愭牱渚嬭緭鍏ャ?br>8
1 2
1 3
1 4
1 5
5 6
5 7
5 8
銆愭牱渚嬭緭鍑恒?br>11
銆愬垎鏋愩?
f[i][j]琛ㄧずi榪欎釜鐐規爣j榪欎釜鏁版墍鑳藉埌杈劇殑鏈灝忔誨箋傛帶鍒秊鐨勮寖鍥村埌30鑲畾榪囥?/p>
1: #include <stdio.h>2: #include <iostream>3: #define MAXINT 100000004: #define maxn 500105: using namespace std;6:7: int f[maxn][31];
8: int bl[maxn][maxn/100];
9: int son[maxn][maxn/100],root[maxn];
10: int n;
11: int x,y;
12: int ans=MAXINT;
13:14: void maket(int x)15: {16: for (int i=1;i<=bl[x][0];++i)17: {18: int k=bl[x][i];
19: if (k==root[x]) continue;20: son[x][++son[x][0]]=k;21: root[k]=x;22: maket(k);23: }24: }25:26: void dp(int x)27: {28: if (f[x][1]) return;29: for (int i=1;i<=30;++i)30: {31: for (int j=1;j<=son[x][0];++j)32: {33: int tt=son[x][j];
34: dp(tt);35: int minn=MAXINT;
36: for (int jj=1;jj<=30;++jj)37: if (jj!=i)
38: if (f[tt][jj]<minn)
39: minn=f[tt][jj];40: f[x][i]+=minn;41: }42: f[x][i]+=i;43: }44: }45:46: int main()
47: {48: freopen("gems.in","r",stdin);49: freopen("gems.out","w",stdout);50:51: scanf("%d",&n);
52: for (int i=1;i<n;++i)53: {54: scanf("%d%d",&x,&y);
55: bl[x][++bl[x][0]]=y;56: bl[y][++bl[y][0]]=x;57: }58: maket(1);59: dp(1);60: for (int i=1;i<=30;++i)61: if (f[1][i]<ans)
62: ans=f[1][i];63: printf("%d\n",ans);
64: return 0;
65: }66:
銆愰棶棰樻弿榪般?/p>
澶鉤鐜嬩笘瀛愪簨浠跺悗錛岄檰灝忓嚖鎴愪簡鐨囦笂鐗硅仒鐨勫盡鍓嶄竴鍝佷緧鍗?/p>
鐨囧浠ュ崍闂ㄤ負璧風偣錛岀洿鍒板悗瀹珨濡冧滑鐨勫瘽瀹紝鍛堜竴媯墊爲鐨勫艦鐘訛紱鏌愪簺瀹闂村彲浠ヤ簰鐩告湜瑙併傚ぇ鍐呬繚鍗.涓ワ紝涓夋涓宀楋紝浜旀涓鍝紝姣忎釜瀹閮借鏈変漢鍏ㄥぉ鍊欑湅瀹堬紝鍦ㄤ笉鍚岀殑瀹瀹夋帓鐪嬪畧鎵闇鐨勮垂鐢ㄤ笉鍚屻?/p>
鍙槸闄嗗皬鍑ゆ墜涓婄殑緇忚垂涓嶈凍錛屾棤璁哄浣曚篃娌℃硶鍦ㄦ瘡涓孌塊兘瀹夌疆鐣欏畧渚嶅崼銆?/p>
甯姪闄嗗皬鍑ゅ竷緗緧鍗紝鍦ㄧ湅瀹堝叏閮ㄥ孌跨殑鍓嶆彁涓嬶紝浣垮緱鑺辮垂鐨勭粡璐規渶灝戙?/p>
銆愭暟鎹緭鍏ャ?/p>
杈撳叆鏁版嵁鐢辨枃浠跺悕涓篒NPUT.TXT鐨勬枃鏈枃浠舵彁渚涖傝緭鍏ユ枃浠朵腑鏁版嵁琛ㄧず涓媯墊爲錛屾弿榪板涓嬶細
絎?琛?n錛岃〃紺烘爲涓粨鐐圭殑鏁扮洰銆?/p>
絎?琛岃嚦絎琻+1琛岋紝姣忚鎻忚堪姣忎釜瀹緇撶偣淇℃伅錛屼緷嬈′負錛氳瀹緇撶偣鏍囧彿i錛?<i<=n錛夛紝鍦ㄨ瀹瀹夌疆渚嶅崼鎵闇鐨勭粡璐筴錛岃杈圭殑鍎垮瓙鏁癿錛屾帴涓嬫潵m涓暟錛屽垎鍒槸榪欎釜鑺傜偣鐨刴涓効瀛愮殑鏍囧彿r1錛宺2錛?..錛宺m銆?/p>
瀵逛簬涓涓猲錛? < n <= 1500錛変釜緇撶偣鐨勬爲錛岀粨鐐規爣鍙峰湪1鍒皀涔嬮棿錛屼笖鏍囧彿涓嶉噸澶嶃?/p>
銆愭暟鎹緭鍑恒?/p>
杈撳嚭鍒癘UTPUT.TXT鏂囦歡涓傝緭鍑烘枃浠朵粎鍖呭惈涓涓暟錛屼負鎵姹傜殑鏈灝戠殑緇忚垂銆?/p>
杈撳叆鏁版嵁紺轟緥 銆杈撳嚭鏁版嵁紺轟緥
25
銆愬垎鏋愩?/p>
鍒嗗埆鐢╢[i][0]琛ㄧずi鐐規斁鐪嬪畧錛宖[i][1]琛ㄧずi鐐逛笉鏀劇湅瀹坕鐐硅鍎垮瓙鐩戣錛宖[i][2]琛ㄧずi鐐逛笉鏀劇湅瀹坕鐐硅鐖惰妭鐐圭洃瑙嗕笁涓儏鍐典笅鐨勬渶灝忚垂鐢ㄣ?/p>
f[i][0]=鎵鏈夊瓙鑺傜偣t鐨刦[t][0],f[t][1],f[t][2]涓渶灝忕殑涓涓殑鍚?k[i]
f[i][1]=鏌愪釜瀛愯妭鐐規斁鐪嬪畧+鍏朵粬鑺傜偣鐨刦[t][0],f[t][1]涓渶灝忕殑涓涓殑鍚?/p>
f[i][2]=鎵鏈夊瓙鑺傜偣鐨刦[t][1]鐨勫悎
1: #include <stdio.h>2: #include <iostream>3: #define maxn 15104: #define MAXINT 100000005: using namespace std;6:7: int son[maxn][maxn];
8: int m[maxn];
9: int n,x;
10: int k[maxn];
11: int tem[maxn];
12: bool ro[maxn];
13: int v;
14: int f[maxn][3];
15:16: void dp(int x)17: {18: if (f[x][0]) return;19: for (int i=1;i<=m[x];++i)20: {21: int t=son[x][i];
22: dp(t);23: f[x][0]+=min(f[t][0],min(f[t][1],f[t][2]));24: f[x][2]+=f[t][1];25: }26: f[x][0]+=k[x];27: memset(tem,0,sizeof(tem));
28: int tot=0;
29: for (int i=1;i<=m[x];++i)30: {31: int t=son[x][i];
32: tem[i]=min(f[t][0],f[t][1]);33: tot+=tem[i];34: }35: f[x][1]=MAXINT;36: for (int i=1;i<=m[x];++i)37: {38: int t=son[x][i];
39: if (tot-tem[i]+f[t][0]<f[x][1]) f[x][1]=tot-tem[i]+f[t][0];
40: }41: }42:43: int main()
44: {45: freopen("guard.in","r",stdin);46: freopen("guard.out","w",stdout);47:48: scanf("%d",&n);
49: for (int i=1;i<=n;++i)50: {51: scanf("%d",&x);
52: scanf("%d%d",&k[x],&m[x]);
53: for (int j=1;j<=m[x];++j)54: {55: scanf("%d",&son[x][j]);
56: ro[son[x][j]]=1;57: }58: }59: for (int i=1;i<=n;++i)60: if (!ro[i])
61: {62: v=i;63: break;
64: }65: //for (int i=1;i<=n;++i)
66: //f[i][2]=f[i][1]=MAXINT;
67: dp(v);68: printf("%d\n",min(f[v][0],f[v][1]));
69: return 0;
70: }71:
1: #include <stdio.h>2: #include <stdlib.h>3: #include <iostream>4: #define maxn 60105: using namespace std;6:7: struct ss
8: {9: int ro,nu;
10: } a[maxn];11: int w[maxn];
12: int f[maxn][2];
13: int n;
14: int x,y;
15: int t[maxn];
16:17: int cmp(const void*a,const void*b)18: {19: ss c=*(ss*)a,d=*(ss*)b;20: if (c.ro<d.ro) return -1;21: if (c.ro>d.ro) return 1;22: return 0;
23: }24:25: void dp(int x)26: {27: if (f[x][1]) return;28: for (int i=t[x];i<t[x+1];++i)29: {30: int k=a[i].nu;
31: dp(k);32: f[x][1]+=f[k][0];33: f[x][0]+=max(f[k][0],f[k][1]);34: }35: f[x][1]+=w[x];36: }37:38: int main()
39: {40: freopen("party.in","r",stdin);41: freopen("party.out","w",stdout);42:43: scanf("%d",&n);
44: for (int i=1;i<=n;++i) scanf("%d",&w[i]);45: scanf("%d%d",&x,&y);
46: while (!((!x)&&(!y)))
47: {48: a[x].nu=x;49: a[x].ro=y;50: scanf("%d%d",&x,&y);
51: }52: for (int i=1;i<=n;++i)53: if (!a[i].ro)
54: a[i].nu=i;55: a[0].ro=-1;56: qsort(a,n+1,sizeof(ss),cmp);
57: for (int i=1;i<=n;++i)58: if (!t[a[i].ro])
59: t[a[i].ro]=i;60: t[n+1]=n+1;61: for (int i=n;i>0;--i)62: if (!t[i])
63: t[i]=t[i+1];64: dp(0);65: printf("%d\n",max(f[0][1],f[0][0]));
66: return 0;
67: }68:
N涓換鍔℃帓鎴愪竴涓簭鍒楀湪涓鍙版満鍣ㄤ笂絳夊緟瀹屾垚錛堥『搴忎笉寰楁敼鍙橈級錛岃繖N涓換鍔¤鍒嗘垚鑻ュ共鎵癸紝姣忔壒鍖呭惈鐩擱偦鐨勮嫢騫蹭換鍔°備粠鏃跺埢0寮濮嬶紝榪欎簺浠誨姟琚垎鎵瑰姞宸ワ紝絎琲涓換鍔″崟鐙畬鎴愭墍闇鐨勬椂闂存槸Ti銆傚湪姣忔壒浠誨姟寮濮嬪墠錛屾満鍣ㄩ渶瑕佸惎鍔ㄦ椂闂碨錛岃屽畬鎴愯繖鎵逛換鍔℃墍闇鐨勬椂闂存槸鍚勪釜浠誨姟闇瑕佹椂闂寸殑鎬誨拰錛堝悓涓鎵逛換鍔″皢鍦ㄥ悓涓鏃跺埢瀹屾垚錛夈傛瘡涓換鍔$殑璐圭敤鏄畠鐨勫畬鎴愭椂鍒諱箻浠ヤ竴涓垂鐢ㄧ郴鏁癋i銆傝紜畾涓涓垎緇勬柟妗堬紝浣垮緱鎬昏垂鐢ㄦ渶灝忋?渚嬪錛歋=1錛汿={1,3,4,2,1}錛汧={3,2,3,3,4}銆傚鏋滃垎緇勬柟妗堟槸{1,2}銆亄3}銆亄4,5}錛屽垯瀹屾垚鏃墮棿鍒嗗埆涓簕5,5,10,14,14}錛岃垂鐢–{15,10,30,42,56}錛屾昏垂鐢ㄥ氨鏄?53銆?
銆愯緭鍏ャ?/p>
絎竴琛屾槸N(1<=N<=5000)銆?絎簩琛屾槸S(0<=S<=50)銆?涓嬮潰N琛屾瘡琛屾湁涓瀵規暟錛屽垎鍒負Ti鍜孎i錛屽潎涓轟笉澶т簬100鐨勬鏁存暟錛岃〃紺虹i涓換鍔″崟鐙畬鎴愭墍闇鐨勬椂闂存槸Ti鍙婂叾璐圭敤緋繪暟Fi銆?
銆愯緭鍑恒?
涓涓暟錛屾渶灝忕殑鎬昏垂鐢ㄣ?br>銆愭牱渚嬨?/p>
BATCH.IN | BATCH.OUT |
5 1 1 3 3 2 4 3 2 3 1 4 | 153 |
銆愬垎鏋愩?/p>
dp[i]錛氬畬鎴愬伐浣?鍒板伐浣淚鐨勮垂鐢?鍥犲鍔燬浠嶪鍒癗澧炲姞鐨勮垂鐢ㄧ殑鎬誨拰鐨勬渶灝忚垂鐢ㄣ?/p>
dp[i]=min{dp[k-1]+s*(f[n]-f[k-1])+t[i]*(f[i]-f[k-1])}
1: #include <stdio.h>2: #include <iostream>3: #define MAXINT 100000004: #define maxn 50105: using namespace std;6:7: int n,s;
8: int t[maxn],f[maxn],dp[maxn];
9: int tem;
10:11: int main()
12: {13: freopen("batch.in","r",stdin);14: freopen("batch.out","w",stdout);15:16: scanf("%d%d",&n,&s);
17: for (int i=1;i<=n;++i)18: {19: scanf("%d%d",&t[i],&f[i]);
20: t[i]+=t[i-1];21: f[i]+=f[i-1];22: }23: for (int i=1;i<=n;++i) dp[i]=MAXINT;24: dp[0]=0;25: for (int i=1;i<=n;++i)26: for (int k=1;k<=i;++k)27: {28: tem=dp[k-1]+s*(f[n]-f[k-1])+t[i]*(f[i]-f[k-1]);29: if (tem<dp[i]) dp[i]=tem;
30: }31: printf("%d\n",dp[n]);
32: return 0;
33: }34:
澶氱憺鍗″緱鍒頒簡涓浠芥湁瓚h岄珮钖殑宸ヤ綔銆傛瘡澶╂棭鏅ㄤ粬蹇呴』鍏蟲帀浠栨墍鍦ㄦ潙搴勭殑琛楃伅銆傛墍鏈夌殑琛楃伅閮借璁劇疆鍦ㄤ竴鏉$洿璺殑鍚屼竴渚с?br>澶氱憺鍗℃瘡澶╁埌鏃╂櫒5鐐歸挓閮芥寜鏃惰搗搴婏紝鐒跺悗浠栧紑濮嬪叧鐏傚紑濮嬫椂錛屼粬绔欏湪鏌愪竴鐩忚礬鐏殑鏃佽竟銆?br>姣忕洀鐏兘鏈変竴涓粰瀹氬姛鐜囩殑鐢電伅娉★紝鍥犱負澶氱鍗℃湁鐫鑷鐨勮妭鑳芥剰璇嗭紝浠栧笇鏈涘湪鑰楃數鑳芥繪暟鏈灝戠殑鎯呭喌涓嬪皢鎵鏈夌殑鐏叧鎺夈?br>澶氱鍗″洜涓哄お绱簡錛屾墍浠ュ彧鑳戒互1m/s鐨勯熷害琛岃蛋銆傚叧鐏笉闇瑕佽姳璐歸澶栫殑鏃墮棿錛屽洜涓哄綋浠栭氳繃鏃跺氨鑳藉皢鐏叧鎺夈?br>緙栧啓紼嬪簭錛岃綆楀湪緇欏畾璺伅璁劇疆錛岀伅娉″姛鐜囦互鍙婂绔崱鐨勮搗濮嬩綅緗殑鎯呭喌涓嬪叧鎺夋墍鏈夌殑鐏渶鑰楄垂鐨勬渶灝忚兘閲忋?br>銆愯緭鍏ャ?br>杈撳叆鏂囦歡鐨勭涓琛屽寘鍚竴涓暣鏁癗錛?鈮鈮?000錛岃〃紺鴻鏉戝簞璺伅鐨勬暟閲忋?br>絎簩琛屽寘鍚竴涓暣鏁癡錛?鈮鈮錛岃〃紺哄鐟炲崱寮濮嬪叧鐏殑璺伅鍙風爜銆?br>鎺ヤ笅鏉ョ殑N琛屼腑錛屾瘡琛屽寘鍚袱涓敤絀烘牸闅斿紑鐨勬暣鏁癉鍜學錛岀敤鏉ユ弿榪版瘡鐩忕伅鐨勫弬鏁幫紝鍏朵腑0鈮鈮?000錛?鈮鈮?000銆侱琛ㄧず璇ヨ礬鐏笌鏉戝簞寮濮嬪鐨勮窛紱?鐢ㄧ背涓哄崟浣嶆潵琛ㄧず)錛學琛ㄧず鐏場鐨勫姛鐜囷紝鍗沖湪姣忕閽熻鐏場鎵娑堣楃殑鑳介噺鏁般傝礬鐏槸鎸夐『搴忕粰瀹氱殑銆?br>銆愯緭鍑恒?br>杈撳嚭鏂囦歡鐨勭涓琛屽嵆鍞竴鐨勪竴琛屽簲鍖呭惈涓涓暣鏁幫紝鍗蟲秷鑰楄兘閲忎箣鍜岀殑鏈灝忓箋傛敞鎰忕粨鏋滀笉瓚呰繃1,000,000,000銆?br>銆愭牱渚嬨?/p>
POWER.IN | POWER.OUT |
4 3 2 2 5 8 6 1 8 7 | 56 |
銆愬垎鏋愩?/p>
鐢╟[i][j]琛ㄧず鍏蟲帀i鍒癹鐨勭伅錛?u>鍓╀笅鐨勭伅鐨勫姛鐜囥?/p>
f[i][j][0]琛ㄧずv宸﹂潰鍏蟲帀i錛屽彸闈㈠叧鎺塲鐩忕伅錛屾渶鍚庡仠鍒板乏闈€?/p>
f[i][j][1]琛ㄧずv宸﹂潰鍏蟲帀i錛屽彸闈㈠叧鎺塲鐩忕伅錛屾渶鍚庡仠鍒板彸闈€?/p>
鍒濆鏉′歡錛?/p>
f[0,0,0]=f[1,0,0]=0
杞Щ鏂圭▼錛?/瀵逛簬鎵鏈夌殑i鍜宩錛屾弧瓚?<i<=v-1錛?<j<=n-v
f[0,I,0]=f[0,i-1,0]+c[v-i+1,v]*(d[v-i+1]-d[v-i]){浠巌-1璧板埌i鎵鑰楀姛鐜噠
f[1,I,0]=f[0,I,0]+c[v-I,v]*(d[v]-d[v-i]){ {浠巌璧板埌v鎵鑰楀姛鐜噠
f[1,0,j]=f[1,0,j-1]+c[v,v+j-1]*(d[v+j]-d[v+j-1])
f[0,0,j]=f[1,0,j]+c[v,v+j]*(d[v+j]-d[v])
f[0,I,j]=min{f[0,i-1,j]+(d[v-i+1]-d[v-i])*c[v-i+1,v+j]錛宖[1,i-1,j]+(d[v+j]-d[v-i])*c[v-i+1,v+j]}
f[1,I,j]=min{f[1,I,j-1]+(d[v+j]-d[v+j-1])*c[v-I,v+j-1]錛宖[0][I,j-1]+(d[v+j]-d[v-i])*c[v-I,v+j-1]}
鏈緇堢粨鏋滐細 Result=min{f[0,v-1,n-v],f[1,v-1,n-v]}
1: #include <stdio.h>2: #include <iostream>3: #define maxn 10104: using namespace std;5:6: int c[maxn][maxn];
7: int sum[maxn][maxn];
8: int d[maxn],w[maxn];
9: int n,v;
10: int f[maxn][maxn][2];
11:12: int main()
13: {14: freopen("power.in","r",stdin);15: freopen("power.out","w",stdout);16:17: scanf("%d%d",&n,&v);
18: for (int i=1;i<=n;++i) scanf("%d%d",&d[i],&w[i]);19: for (int i=1;i<=n;++i)20: for (int j=i;j<=n;++j)21: sum[i][j]=sum[i][j-1]+w[j];22: for (int i=1;i<=n;++i)23: for (int j=i;j<=n;++j)24: c[i][j]=sum[1][n]-sum[i][j];25: memset(f,63,sizeof(f));
26: f[0][0][0]=f[0][0][1]=0; //0left 1right
27: for (int i=1;i<=v-1;++i)28: {29: f[i][0][0]=f[i-1][0][0]+c[v-i+1][v]*(d[v-i+1]-d[v-i]);30: f[i][0][1]=f[i][0][0]+c[v-i][v]*(d[v]-d[v-i]);31: }32: for (int j=1;j<=n-v;++j)33: {34: f[0][j][1]=f[0][j-1][1]+c[v][v+j-1]*(d[v+j]-d[v+j-1]);35: f[0][j][0]=f[0][j][1]+c[v][v+j]*(d[v+j]-d[v]);36: }37: for (int i=1;i<=v-1;++i)38: for (int j=1;j<=n-v;++j)39: {40: f[i][j][0]=min(f[i-1][j][0]+c[v-i+1][v+j]*(d[v-i+1]-d[v-i]),f[i-1][j][1]+c[v-i+1][v+j]*(d[v+j]-d[v-i]));41: f[i][j][1]=min(f[i][j-1][1]+c[v-i][v+j-1]*(d[v+j]-d[v+j-1]),f[i][j-1][0]+c[v-i][v+j-1]*(d[v+j]-d[v-i]));42: }43: printf("%d\n",min(f[v-1][n-v][1],f[v-1][n-v][0]));
44: return 0;
45: }46:47: