锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鐘舵佽〃紺哄畬灝辮澶勭悊杞Щ浜嗭紝濡備綍鍒ゆ柇涓涓漿縐繪槸鍚﹀悎娉曟瘮杈冮毦鍔烇紝鐢ㄤ竴涓猟fs鍗村彲浠ョ畝媧佺殑瑙e喅榪欎釜闂銆?br>瀵逛簬涓婁竴琛屽埌涓嬩竴琛岀殑杞Щ錛岃瀹氫笂涓琛屼竴瀹氬~婊★紝榪欐牱鏈変笁縐嶆柟寮忥細 榪樻湁涓涓棶棰橀渶瑕佽冭檻錛岄偅灝辨槸鍒濆煎拰鏈緇堢殑緇撴灉銆傚鏋滃鎵懼悎娉曠姸鎬侊紝渚濈劧姣旇緝楹葷儲錛屽亣璁懼叡鏈塶琛岋紝鍙互鍒嗗埆鍦ㄨ繖n琛屼笂涓嬫柊鍔犱袱琛屻備笅闈竴琛岄兘鏄?錛岀敱浜庣n琛岃偗瀹氳濉弧錛岃繖鏍鋒柊鍔犵殑鍏?鐨勮灝辯浉褰撲簬欏朵綇浜嗙n琛屼嬌鍏舵病鏈夊嚫鍑猴紙鏈夊嚫鍑洪偅涔堢n+1琛屾湁0錛夛紝鑰岄氳繃絎琻琛屽埌絎琻+1琛岃漿縐諱繚鐣欎簡鎵鏈夊悎娉曠姸鎬侊紱鍚岀悊鏈涓婇潰鍔犵殑閭h淇濊瘉絎竴琛屾病鏈夊嚫鍑恒傛渶鍚庣n+1琛屽搴斿叏1鐨勭姸鎬佸氨鏄渶緇堢殑緇撴灉浜嗐傞氳繃鏂板姞琛屽閥濡欏湴瑙e喅浜嗗垵鍊煎拰緇堝箋?/p>
瀹炵幇鐨勬椂鍊欎篃闇瑕佹敞鎰忎竴涓嬶紝鍦═SP闂涓紝澶栧眰寰幆鏄姸鎬侊紝鍐呭眰鏄偣錛屼箣鎵浠ヨ繖鏍峰啓鍥犱負鍦ㄦ灇涓劇偣鐨勬椂鍊欙紝鍙兘浼氫粠姣斿綋鍓嶇紪鍙峰ぇ鐨勭偣杞Щ錛屼絾鏄敱浜庢棤璁烘庢牱杞Щ榪囨潵鐨勭姸鎬佽偗瀹氭瘮褰撳墠鐘舵佸皬錛堝幓鎺変簡1錛夛紝鎵浠ュ厛浠庡皬鍒板ぇ鏋氫婦鐘舵佸氨淇濊瘉杞Щ榪囨潵鐨勭姸鎬佷竴瀹氭槸綆楄繃鐨勩傝岃繖涓鐩噷闈㈡濂藉弽榪囨潵錛屽洜涓虹姸鎬佸彲鑳戒粠姣斿綋鍓嶇姸鎬佸ぇ鐨勭姸鎬佽漿縐昏繃鏉ワ紝鑰岃鏁拌偗瀹氭槸浠庣紪鍙峰皬鐨勮杞Щ錛屽洜姝ゅ厛鏋氫婦琛屽氨鑳戒繚璇佽漿縐昏繃鏉ョ殑鐘舵佷竴瀹氭槸鏇存柊榪囩殑銆?/p>
銆愰鐩垎鏋愩?br>銆銆瀵逛簬媯嬬洏鏀捐濺闂鍙互鐢ㄧ粍鍚堟暟瀛︾殑鐭ヨ瘑鏉ヨВ鍐籌紝浣嗘槸瀵逛簬鍚鍖虹殑鎽嗘斁闂錛岃櫧鐒剁粍鍚堟暟瀛︾粰鍑轟簡緇忓吀鐨勬鐩樺欏瑰紡+瀹規枼鍘熺悊鐨勮В娉曪紝浣嗘槸瀹為檯涓鐩樺欏瑰紡鐨勬眰瑙f槸寰堝洶闅劇殑錛屽洜姝や竴鑸渶瑕佸熷姪鐘舵佸帇緙╁姩鎬佽鍒掓眰瑙c?br>銆銆鐜板湪棰樼洰涓姹傚嚭浜掍笉鏀誨嚮鐨勮薄鐨勬柟娉曟暟錛岃薄鐨勬敾鍑昏礬綰挎槸鏂滅殑錛屾槸涓嶆槸鍙互鑰冭檻閲囩敤鏀捐濺鐨勬柟娉曟潵瑙e憿錛熷皢媯嬬洏榛戠櫧鏌撹壊錛屽鏋滀竴涓薄鍦ㄩ粦鑹茬殑鏍煎瓙閲岄潰錛岄偅涔堝畠涓瀹氫笉浼氭敾鍑誨埌鐧借壊鐨勬牸瀛愶紝榪欐牱鐨勮瘽鍙互鍒嗗紑璁℃暟錛岀劧鍚庢渶鍚庡埄鐢ㄤ箻娉曞師鐞嗗姞璧鋒潵灝辮浜嗐傛妸媯嬬洏鏃嬭漿45搴︼紝榪欐牱璞$殑鏀誨嚮璺嚎灝辨槸鐩寸殑浜嗭紝濡傛灉鍙冭檻涓縐嶉鑹茬殑璇濓紝閭d箞闂灝辮漿鍙樻垚浜嗙粡鍏哥殑鏀捐濺闂浜嗭紝鍙互鍒╃敤鍔ㄦ佽鍒掕В鍐熾?br>銆銆璁綿p[i][j]琛ㄧず鍓峣琛屾斁浜唈涓濺鐨勬柟娉曟暟錛宑[i]琛ㄧず絎琲琛屽彲浠ユ斁緗殑媯嬪瓙鏁伴噺錛岄偅涔堣漿縐繪柟紼嬩負錛?br>銆銆銆銆dp[i][j]
= dp[i-1][j] + dp[i-1][j-1] * (c[i] - (j -
1))
銆銆闇瑕佹敞鎰忕殑鏄痗鏁扮粍搴旇鏄搴忕殑錛岃繖鏍鋒墠鑳戒繚璇佸墠闈㈢殑j-1琛屾斁浜嗚濺錛屽搴旇繖涓琛屽氨鏈塲-1涓綅緗笉鍙斁浜嗐?br>銆銆榪欎釜棰樼洰鐨刣p鏂圭▼涓嶉毦鎯籌紝浣嗘槸濡備綍鎶婃ā鍨嬭漿鍖栧埌鏀捐濺闂鏄笉瀹規槗鎯沖埌鐨勶紝灝ゅ叾鏄皢媯嬬洏榛戠櫧鏌撹壊鍚庡垎寮璁℃暟鐨勬兂娉曪紝闈炲父宸у銆?br>
棰樼洰浠g爜錛?
2 #include <algorithm>
3 using namespace std;
4 const int N = 70;
5
6 void init(int n, int c1[N], int c2[N])
7 {
8 memset(c1, 0, sizeof(int) * N);
9 memset(c2, 0, sizeof(int) * N);
10 for (int i = 1; i <= n; i++)
11 {
12 for (int j = 1; j <= n; j++)
13 {
14 if ((i + j) & 1)
15 c2[(i+j)/2]++;
16 else
17 c1[(i+j)/2]++;
18 }
19 }
20 }
21 void bishops(int n, int dp[N][N], int c[N])
22 {
23 for (int i = 0; i <= n; i++)
24 dp[i][0] = 1;
25 for (int i = 1; i <= n; i++)
26 for (int j = 1; j <= c[i]; j++)
27 dp[i][j] = dp[i-1][j] + dp[i-1][j-1] * (c[i] - j + 1);
28 }
29
30 int main()
31 {
32 int n, k, c1[N], c2[N], dp1[N][N], dp2[N][N], ans;
33
34 while (scanf("%d %d", &n, &k) == 2)
35 {
36 if (n == 0 && k == 0)
37 break;
38 init(n, c1, c2);
39 sort(c1 + 1, c1 + n + 1);
40 sort(c2 + 1, c2 + n);
41 memset(dp1, 0, sizeof(dp1));
42 memset(dp2, 0, sizeof(dp2));
43 bishops(n, dp1, c1);
44 bishops(n - 1, dp2, c2);
45 ans = 0;
46 for (int i = 0; i <= k; i++)
47 ans += dp1[n][i] * dp2[n-1][k-i];
48 printf("%d\n", ans);
49 }
50
51 return 0;
52 }
娉細鏈枃浣滀簬2009騫?鏈?3鏃?19鐐?1鍒?br>
]]>
銆銆銆銆2.
鍦ㄦ父鎴忎腑鐨勪換鎰忔椂鍒伙紝姣忎釜鐜╁鍙夋嫨鐨勭姸鎬佹槸鍥哄畾鐨勶紝娌℃湁闅忔満鎴愬垎
銆銆銆銆3.
娓告垙鍦ㄦ湁闄愭鏁板唴緇撴潫錛屾病鏈夊鉤灞鍑虹幇
銆銆澶ч儴鍒嗙殑棰樼洰閮芥弧瓚充笂榪版潯浠訛紝鍥犳榪欓噷鍙璁哄湪涓婅堪鏉′歡鑼冪暣鍐呯殑鍗氬紙闂銆傝繖綾誨崥寮堥棶棰橈紝閫氬父榪樻湁鑻ュ共鍒嗙被銆備竴縐嶆槸瑙勫畾縐誨姩鏈鍚庝竴姝ョ殑娓告垙鑰呰幏鑳滐紝榪欑瑙勫垯鍙仛Normal Play Rule錛涘彟涓縐嶆槸瑙勫畾縐誨姩鏈鍚庝竴姝ョ殑娓告垙鑰呰緭錛岃繖縐嶈鍒欏彨鍋?span style="color: red;">Misere Play
Rule錛屼篃縐頒負Anti-SG娓告垙銆傛澶栵紝瀵逛簬娓告垙鐨勫弻鏂癸紝濡傛灉浜岃呭崥寮堢殑瑙勫垯鐩稿悓錛岄偅涔堢О涓鴻繖綾繪父鎴忔槸瀵圭瓑(impartial games)鐨勶紱鍚﹀垯縐頒負涓嶅鉤絳夋父鎴?/span>(partizan games
)銆傚綋鍒漌HU鐨勯偅鍦烘瘮璧涘氨鏄敱浜庡浜庤繖涓蹇典笉鏄緢娓呮櫚錛屽鑷寸湅瀹岄鐩箣鍚庡氨鐢⊿G瀹氱悊鏉ュ仛錛屾氮璐逛簡寰堝鏈烘椂銆傚疄闄呬笂錛岃В鍐充笉騫崇瓑鍗氬紙闂鐨勬柟娉曞拰鏅氱殑鍗氬紙闂錛圫G娓告垙錛夋槸鏈夊尯鍒殑錛屼竴鑸細閲囩敤鍔ㄦ佽鍒掓垨鑰卻urreal number銆?br>
銆愬崥寮堝熀紜鐭ヨ瘑銆?br>銆銆鍦⊿G娓告垙涓紝鏈涓轟漢鐔熺煡鐨勬槸蹇呰儨蹇呰觸鎬侊紝涔熷彨NP鎬佺悊璁恒傛敞鎰忕殑鏄紝P鎬佸搴旂殑鏄厛鎵嬪繀璐ユ侊紝N鎬佸搴旂殑鏄厛鎵嬪繀鑳滄併傚繀鑳滃繀璐ユ佺悊璁烘槸錛?br>銆銆1. All terminal positions are
P-positions
銆銆2. From every
N-position, there is at least one move to a P-position
銆銆3. From every P-position, every move is to an
N-position
銆銆鑻辨枃鐨勮〃榪伴潪甯哥畝媧佹竻鏅幫紝鑰屼笖榪欎釜鐞嗚涔熷緢濂界悊瑙o紝濡傛灉鍦ㄥ綋鍓嶇姸鎬佺殑涓嬩竴姝ュ彲浠ヨ蛋鍒板繀璐ユ侊紝閭d箞褰撳墠鐜╁灝卞彲浠ヨ蛋鍒伴偅涓姸鎬侊紝鎶婂繀璐ユ佹帹緇欏彟涓鏂癸紱濡傛灉鎵鏈夊彲杈劇姸鎬侀兘鏄繀鑳滄侊紝閭d箞褰撳墠鐜╁鏃犺濡備綍璧幫紝閮戒細鎶婂繀鑳滄佽緇欏鏂廣傛牴鎹繀鑳滃繀璐ユ佺悊璁猴紝鎴戜滑鍙互閫掑綊鐨勬眰鍑烘瘡涓姸鎬佹槸N鎬佽繕鏄疨鎬併傚繀鑳滃繀璐ユ佺悊璁哄叾瀹炲凡緇忔妸鍗氬紙闂杞寲鎴愪簡涓涓湁鍚戝浘錛屽熷姪鍥捐繖涓ā鍨嬫潵鍒嗘瀽闂錛屼嬌寰楅棶棰樺彉寰楀艦璞′簡璁稿銆傞渶瑕佹敞鎰忕殑鏄紝榪欑SG娓告垙瀵瑰簲鐨勬湁鍚戝浘鏄棤鐜殑錛屽洜涓哄鏋滄湁鐜紝閭d箞娓告垙鍙屾柟灝卞彲鑳藉湪鐜笂涓嶅仠鐨勮漿鎹㈢姸鎬侊紝娓告垙涓嶈兘鍦ㄦ湁闄愭緇堟錛岃繖鏍峰氨涓嶆弧瓚崇粍鍚堟父鎴忕殑鐗瑰緛3浜嗐?br>銆銆鐒惰屽湪寰堝鏃跺欎粎浠呯煡閬撴煇涓姸鎬佹槸蹇呰儨榪樻槸蹇呰觸鏄笉澶熺殑錛屽洜涓哄鏋滃瓨鍦ㄥ涓粍鍚堟父鎴忥紙姣斿緇忓吀鐨凬im錛夛紝瀵瑰簲鐨勭姸鎬侀泦鍚堥潪甯稿ぇ錛屾棤娉曠洿鎺ュ埄鐢ㄥ繀鑳滃繀璐ユ佺悊璁烘眰瑙o紝鍥犳闇瑕佺敤鍒板崥寮堣涓竴涓緢閲嶈鐨勫伐鍏鳳細SG鍑芥暟銆?br>銆銆鏌愪釜鐘舵佺殑SG鍑芥暟鍊煎畾涔変負褰撳墠鐘舵佹墍鏈変笉鍙揪鐨勭姸鎬佺紪鍙蜂腑鏈灝忕殑緙栧彿錛屽叾涓粓姝㈡佺殑SG鍑芥暟鍊兼槸0銆傛湁浜嗚繖涓伐鍏鳳紝灝卞紩鍏ヤ竴涓潪甯稿己澶х殑瀹氱悊鈥斺擲G鍒嗚В瀹氱悊錛?br>
銆銆澶氫釜緇勫悎娓告垙鐨凷G鍑芥暟鍊兼槸姣忎釜緇勫悎娓告垙鐨勫嚱鏁板肩殑鍜屻?/span>錛堣繖閲岀殑鍜屽畾涔変負寮傛垨鎿嶄綔錛?br>銆銆
銆銆SG鍒嗚В瀹氱悊鐨勮瘉鏄庝笉鏄緢闅撅紝鍏跺疄鍜孨im鐨勮瘉鏄庡緢鍍忋傛牴鎹繖涓畾鐞嗭紝鎴戜滑灝辯煡閬撲負浠涔圢im鐨勮В娉曟槸寮傛垨鎵鏈夌殑鐭沖瓙涓暟浜嗭紝鍥犱負姣忓爢鐭沖瓙鐨凷G鍊煎氨鏄煶瀛愮殑涓暟銆係G鍒嗚В瀹氱悊鍛婅瘔鎴戜滑浠諱綍SG娓告垙閮藉彲浠ヨ漿鍖栨垚Nim娓告垙鏉ュ仛銆?br>銆銆Nim涓殑涓涓彉褰㈠氨鏄嬁璧版渶鍚庝竴鍧楃煶瀛愮殑浜虹畻杈撱傞氳繃淇敼SG鐨勮綆楄鍒欙紝鍙互寰楀嚭鐩稿悓鐨勭粨璁猴紙鍥犱負褰撶煶瀛愪釜鏁版槸1鐨勬椂鍊橲G鍊間負0錛屽洜姝よ鍗曠嫭澶勭悊錛夛紱褰撶劧涔熷彲浠ュ埄鐢ㄤ竴涓彨鍋歋J瀹氱悊鐨勬柟娉曟潵鍋氾紝渚濈劧鏄澶勭悊褰撴墍鏈夊爢鐨凷G鍊間笉澶т簬1鐨勬儏鍐點?br>
銆愬崥寮堝熀鏈ā鍨嬨?br>銆銆闄や簡Nim妯″瀷錛屽緢澶氭ā鍨嬮兘鐪嬩技澶嶆潅錛屾渶鍚庨兘鍒掑綊鍒頒簡Nim妯″瀷涓婏紝鐒跺悗鍒╃敤SG鍒嗚В鏉ュ仛鐨勩傚湪璇佹槑涓ょ妯″瀷絳変環鐨勬椂鍊欙紝鍙互閫氳繃璁$畻SG鍊煎垽鏂槸鍚︾浉鍚岋紝鎴栬呴氳繃鍒ゆ柇蹇呰儨絳栫暐鐨勮蛋娉曞皢鍏惰漿鍖栦負Nim銆傝澶氭ā鍨嬮潪甯哥殑紲炲錛屽叾鑾瘋儨絳栫暐鍙堝崈宸竾鍒紝鍥犳鏃犳硶涓涓鍒椾婦錛屼絾鏄帉鎻′竴浜涚粡鍏告ā鍨嬫槸蹇呴』鐨勶紝榪欐牱閫氳繃妯″瀷鐨勮漿鍖栧彲浠ョ畝鍖栭棶棰樼殑闅懼害銆?br>銆銆緇忓吀妯″瀷1錛歂im鍙樼銆?/span>鍖呮嫭錛?br>銆銆銆銆(1)
妤兼Nim銆傛妸濂囨暟鍙伴樁鐨勭煶瀛愪綔涓篘im錛屼簩鑰呯瓑浠鳳紝鍥犱負蹇呰儨鐨勭瓥鐣ユ槸鐩稿悓鐨勩?br>銆銆銆銆(2) 姣忔鍙互鍙杒鍫嗭紝榪欎釜鏄粡鍏哥殑Moore
Nim銆傚畠鏄硾鍖栫殑Nim娓告垙銆?br>銆銆銆銆(3)
涓ゅ爢鐭沖瓙錛屾瘡嬈″彲浠ュ彇涓鍫嗘垨涓ゅ爢錛屼粠涓ゅ爢鍙栧緱鏃跺欎釜鏁板繀欏葷浉鍚岋紝璋佸厛鍙栧畬鑾瘋儨銆傝繖涓槸钁楀悕鐨勫▉浣愬か鍗氬紙錛岃窡榛勯噾鍒嗗壊鏁版湁鍏籌紝鍏蜂綋璇佹槑涓嶆槸寰堟竻妤氾紝浣嗘槸鐢⊿G鍊兼墦琛ㄥ彲浠ユ壘鍑鴻寰嬨備唬鐮佸涓嬶細
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{
const double k = (sqrt(5.0) + 1) / 2.0;
int a, b, t;
while (scanf("%d %d", &a, &b) == 2)
{
if (a > b)
swap(a, b);
t = b - a;
if (a == (int)(t * k))
puts("0");
else
puts("1");
}
return 0;
}
銆銆銆銆(4) Subtraction
Games銆備竴縐嶉氱敤鐨凬im娓告垙錛屾瘡嬈′粠鍙敤鐘舵侀泦鍚堜腑閫夋嫨涓嬩竴姝ョ殑鐘舵侊紝鏈夊緢澶氬彉褰紝鏍稿績鎬濇兂榪樻槸璁$畻SG鍑芥暟鍊箋?br>銆銆銆銆(5)
Take-and-Break Game銆傛瘡嬈℃妸灞闈㈠垎鎴愬涓狽im瀛愭父鎴忥紝鍒╃敤SG鍒嗚В瀹氱悊姹傚嚭瀵瑰簲鐨凷G鍊箋?br>銆銆緇忓吀妯″瀷2錛氱炕紜竵娓告垙(Coin Turning
Game)
銆銆銆銆(1) 涓緇寸殑緲葷‖甯佹父鎴忥紝姣忔鍙互緲?涓垨涓や釜銆傞氳繃鍗曠嫭鑰冭檻姣忎釜鍙互緲葷殑紜竵鍙戠幇錛孋oin Turning
Game鐨凷G鍊煎拰Nim絳変環錛屽洜姝や袱涓ā鍨嬬瓑浠楓傞渶瑕佹敞鎰忕殑鏄紝璁稿緲葷‖甯佹父鎴忔牴鎹鐩殑瑕佹眰錛屼竴鑸紪鍙蜂粠0寮濮嬨?br>銆銆銆銆(2)
涓緇寸殑緲葷‖甯佹父鎴忥紝姣忔鍙互緲?涓垨涓や釜錛岄檺瀹氫簡緲葷浜屾灇紜竵鐨勮寖鍥達紝閭d箞灝卞拰Subtraction Game絳変環浜嗐?br>銆銆銆銆(3)
涓緇寸殑緲葷‖甯佹父鎴忥紝姣忔鍙互緲?涓?涓垨3涓紝榪欎釜娓告垙鍙仛Mock Turtles錛屾湁涓涓濂囩殑瑙勫緥錛屾槸Odious Number搴忓垪銆?br>銆銆銆銆(4)
楂樼淮鐨勭炕紜竵娓告垙錛岄渶瑕佺敤鍒癗im縐拰Tartan瀹氱悊銆?br>銆銆緲葷‖甯佹ā鍨嬬殑鍙樺寲鏇村錛屽緢澶氭ā鍨嬮兘鏈変竴浜涘濡欑殑瑙勫緥錛岄渶瑕佹墦琛ㄦ墠鑳藉彂鐜般?br>銆銆緇忓吀妯″瀷3錛氬垹杈規父鎴?Green Hackenbush)
銆銆銆銆(1)
鏍戠殑鍒犺竟娓告垙錛欳olon鍘熺悊璇佹槑榪欑妯″瀷鍜孨im渚濈劧鏄瓑浠風殑錛屽涓弶鐨凷G鍊煎紓鎴栧氨鏄搴旀牴鑺傜偣鐨凷G鍊箋?br>銆銆銆銆(2)
鏃犲悜鍥懼垹杈規父鎴忥細鍒╃敤Fursion瀹氱悊鏀剁緝鍦堬紝鐒跺悗灝辮漿鎹㈡垚鏍戠殑鍒犺竟娓告垙浜嗭紝涓嶈繃榪欎釜瀹氱悊榪樹笉浼氳瘉銆?
娉細鏈枃浣滀簬2009騫?鏈?鏃?09鐐?3鍒?br>
]]>
銆銆涓涓? * 3鐨勬鐩樻湁3縐嶆憜娉曪紝涓涓?*3鐨勬鐩橀渶瑕佺浉浜掍氦閿欑殑鎽嗘斁錛屽洜姝ゆ湁2縐嶆憜娉曪紝鍏朵綑渚濇綾繪帹銆?br>銆銆浣嗘槸榪欎釜閫掓帹鏂圭▼瀵逛簬榪欐牱鐨勬暟鎹噺鑲畾鏄棤娉曟帴鍙楃殑銆傚皢鏂圭▼榪涜鍖栫畝錛?br>銆銆銆銆f[n] = f[n-2] * 3 + (3 * f[n-4] + f[n-6] * 2 + ...) - f[n-4]
銆銆銆銆銆銆 = f[n-2] * 3 + f[n-2] - f[n-4]
銆銆銆銆銆銆 = 4 * f[n-2] - f[n-4]
銆銆榪欐牱灝辮漿鍖栨垚浜嗙嚎鎬ч掓帹鏂圭▼錛屽彲浠ョ敤鐭╅樀鏉ュ仛浜嗐?br>銆銆璇濊榪欎釜棰樼洰鎴戝湪HOJ涓婂仛鐨勬椂鍊欏洜涓烘暟鎹皬灝辯洿鎺(n^2)浜嗭紝鐪嬫潵瀵逛簬涓涓鐩粩緇嗘濊冦佸彂鏁f濈淮榪樻槸寰堥噸瑕佺殑銆?br>銆銆鏃㈢劧3*n鐨勫彲浠ュ仛錛岄偅涔?*n搴旇涔熷彲浠ャ傚悗鏉ュ彂鐜板眳鐒惰繕鐪熸湁榪欎釜棰橈細POJ 3420銆?*n鐨勯掓帹鏂圭▼涓猴細
銆銆銆銆f[n] = f[n-1] + 4 * f[n-2] + 2 * f[n-3] + 3 * f[n-4] + 2 * f[n-5] + 3 * f[n-6] + ...
銆銆銆銆銆銆 = 5 * f[n-2] + 6 * f[n-3] + 5 * f[n-4] + 5 * f[n-5] + ...
銆銆銆銆銆銆 = 5 * f[n-2] + (5 * f[n-3] + 6 * f[n-4] + 5 * f[n-5] + ...) + f[n-3] - f[n-4]
銆銆銆銆銆銆 = 5 * f[n-2] + f[n-1] + f[n-3] - f[n-4]
銆銆鍚庨潰鐨勫仛娉曞氨涓鏍蜂簡錛岀畻娉曞鏉傚害(4 ^ 3 * log n)銆?br>
]]>
dfs(col + 1, (s1 << 1) | 1, s2 << 1, n);
dfs(col + 1, s1 << 1, (s2 << 1) | 1, n);
dfs(col + 2, (s1 << 2) | 3, (s2 << 2) | 3, n);
絎竴縐嶄笂闈㈡槸1錛岄偅涔堜笅闈竴瀹氭槸0錛岃〃紺烘槸涓涓珫鏀劇殑鏈ㄥ潡銆?br>絎簩縐嶄笂闈㈡槸0錛屽氨鏄榪欎釜浣嶇疆涓瀹氭槸涓涓珫鏀炬湪鍧楃殑涓嬪崐鎴紝閭d箞涓嬩竴琛岃偗瀹氭槸瑕佸彟璧蜂竴琛屼簡錛屾斁涓涓珫鏀炬垨鑰呮í鏀劇殑鏈ㄥ潡閮藉繀欏繪槸1銆?br>絎笁縐嶇浉褰撲簬涓婁笅涓よ鍚勬斁涓涓í鏈ㄥ潡銆?br>瀹炵幇鐨勬椂鍊欐垜鐢ㄤ簡涓涓獀ector璁板綍姣忎釜鐘舵佹墍鏈夊彲琛岀殑杞Щ錛岃繖鏍峰湪dp鐨勬椂鍊欏彲浠ュ姞蹇竴浜涙晥鐜囥?/p>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 11;
vector<int> g[1<<N];
long long dp[N+2][1<<N];
void dfs(int col, int s1, int s2, int n)
{
if (col >= n)
{
if (s1 < (1 << n) && s2 < (1 << n))
g[s2].push_back(s1);
return;
}
dfs(col + 1, (s1 << 1) | 1, s2 << 1, n);
dfs(col + 1, s1 << 1, (s2 << 1) | 1, n);
dfs(col + 2, (s1 << 2) | 3, (s2 << 2) | 3, n);
}
long long calc(int m, int n)
{
if (m < n) swap(m, n);
dfs(0, 0, 0, n);
int state = 1 << n;
dp[0][0] = 1;
for (int i = 1; i <= m + 1; i++)
for (int s = 0; s < state; s++)
for (int j = 0; j < g[s].size(); j++)
dp[i][s] += dp[i-1][g[s][j]];
return dp[m+1][state-1];
}
int main()
{
int m, n;
while (scanf("%d %d", &m, &n) == 2)
{
if (m == 0 && n == 0)
break;
for (int i = 0; i < (1 << N); i++)
g[i].clear();
memset(dp, 0, sizeof(dp));
printf("%I64d\n", calc(m, n));
}
return 0;
}
]]>
銆銆涔熷氨鏄絎琲涓暟瑕佷箞鑷繁鍒掑埌絎琷孌碉紝瑕佷箞鍜屽墠涓涓暟涓璧峰垝鍒扮j孌甸噷闈紝杞Щ鏄疧(n)鐨勶紝鎬誨鏉傚害O(n * n * m)銆?br>銆銆鍙互寮曞叆涓涓緟鍔╂暟緇勬潵浼樺寲杞Щ銆傝g(i, j)琛ㄧず鍓峣涓暟鍒掑垎鎴恓孌電殑鏈澶у瓙孌靛拰錛堟敞鎰忕i涓暟鏈繀鍦╦孌甸噷闈級錛岄偅涔堥掓帹鍏崇郴濡備笅錛?br>銆銆銆銆g(i, j) = max{g(i - 1, j), f(i, j)}錛屽垎鏄惁鍔犲叆絎琲涓暟鏉ヨ漿縐?br>銆銆榪欐牱f鐨勯掓帹鍏崇郴灝卞彉鎴愶細
銆銆銆銆f(i, j) = max{f(i - 1, j), g(i - 1, j - 1)} + v[i]錛岃漿縐誨彉鎴愪簡O(1)
銆銆榪欐牱鏈鍚庣殑緇撴灉灝辨槸g[n][m]錛岄氳繃寮曞叆杈呭姪鏁扮粍宸у鐨勪紭鍖栦簡杞Щ銆傚疄鐜扮殑鏃跺欏彲浠ョ敤涓緇存暟緇勶紝閫熷害寰堝揩銆?br>
闄凥DU 1024棰樼洰浠g爜錛?br>
#include <algorithm>
using namespace std;
const int N = 1000010, INF = 0x3fffffff;
int f[N], g[N], a[N];
int max_sum(int m, int n)
{
int i, j, t;
for (i = 1; i <= n; i++)
{
t = min(i, m);
for (j = 1; j <= t; j++)
{
f[j] = max(f[j], g[j-1]) + a[i];
g[j-1] >?= f[j-1];
}
g[j-1] >?= f[j-1];
}
return g[m];
}
int main()
{
int m, n;
while (scanf("%d %d", &m, &n) == 2 && m && n)
{
for (int i = 1; i <= n; i++)
{
f[i] = g[i] = -INF;
scanf("%d", &a[i]);
}
printf("%d\n", max_sum(m, n));
}
return 0;
}
]]>
榪欎釜棰樼洰鎴戣鐨勪笁緇寸姸鎬侊紝dp[i][j][k]琛ㄧず鍓峣涓瓕鏇叉斁鍦ㄥ墠j涓敱鐗囦腑絎琷涓敱鐗囩敤浜唊鍒嗛挓鐨勬渶澶ф瓕鏇叉暟銆?br>杞Щ鏂圭▼錛歞p[i][j][k] = max{ dp[i-1][j][k-w[i]] + 1, dp[i-1][j][k], dp[i-1][j-1][p] } p = 0...t
璺熻儗鍖呴棶棰樺樊涓嶅錛屽氨鏄姞浜嗕竴涓敱鐗囦釜鏁板拰瀹歸噺鐨勯檺鍒躲備笁緇寸姸鎬佷竴緇磋漿縐伙紝鏃墮棿澶嶆潅搴?O(n * m * t * t)
ID: shyprom1
PROG: rockers
LANG: C++
*/
#include <cstdio>
int main()
{
freopen("rockers.in", "r", stdin);
freopen("rockers.out", "w", stdout);
const int N = 32;
int n, m, t, v, dp[N][N] = {0}, ans = 0;
scanf("%d %d %d", &n, &t, &m);
for (int i = 1; i <= n; i++)
{
scanf("%d", &v);
for (int j = 1; j <= m; j++)
{
for (int k = t; k >= 0; k--)
{
for (int p = 1; p <= t; p++)
dp[j][k] >?= dp[j-1][p];
if (k >= v)
dp[j][k] >?= dp[j][k-v] + 1;
}
}
}
for (int i = 0; i <= t; i++)
ans >?= dp[m][i];
printf("%d\n", ans);
return 0;
}
]]>