锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
銆愰鐩垎鏋愩戝皢楠板瓙緗楀垪錛屾眰鏈澶х殑渚ч潰錛岃繕瑕佹眰鐩擱偦涓や釜楠板瓙鎺ヨЕ闈㈢紪鍙風浉絳夛紵錛佽濡備綍瑙e喅鍛紵鐪嬪浘錛屽厛鏉ヨВ鍐崇浉閭葷殑涓や釜闈㈢紪鍙風浉絳夌殑闂錛佹湁鍥懼緱鍒?/span>
棰樼洰涓粰鍑轟簡榪欎釜鏉′歡鏄嫚閲嶈灝辨槸錛屽氨鏄竴涓瀛愬彲浠ュ乏鍙寵漿鍔紝榪欐彁紺烘垜浠按騫崇殑鍥涗釜闈腑緙栧彿鏈澶х殑闈㈡繪槸鍙互杞埌涓涓潰涓婄殑銆傜敱姝わ紝鎴戜滑鍙互紜畾閭d釜闈㈠拰鍏朵綑楠板瓙鎺ヨЕ鐨勬椂鍊欙紝紜畾榪欎釜楠板瓙鎻愪緵鐨勬渶澶х殑闈㈢Н銆?/span>
紜畾榪欎袱涓搗鍒濈湅鏄笉紜畾鐨勯棶棰橈紝涓嬮潰鐨勭畻娉曞氨鏄瘮杈冮氫織鐨勪簡銆?/span>
璁?/span>
鑻ュ彧鏀句竴涓瓫瀛愶紝
瀵逛簬宸叉斁緗殑楠板瓙錛屽彲浠ヨ漿縐誨埌涓烘斁緗殑涓婇潰錛屾墍浠ワ紝鏋氫婦鍚堟硶鐨勭姸鎬侊紝鐒跺悗娣誨姞楠板瓙錛屽悓鏃舵洿鏂扮姸鎬佸箋?/span>
銆愯緇嗕唬鐮併戜笅闈㈡槸AC鐨勪唬鐮併?/span>
//Name: pku_2596_Dice Stacking
#include <iostream>
using namespace std;
#define max(a, b)((a)=((a)>(b)?(a):(b)))
const int f[6]={5,4,3,2,1,0};
int a[10][10], b[10][10];
int dp[1<<10][10][6], n, ans;
int main() {
//freopen("in.in", "r", stdin);
int ca, i, j, k, p, q, t, kn;
scanf("%d", &ca);
while(ca-- && scanf("%d", &n)) {
kn = 1<<n;
memset(b, 0, sizeof(b));
for(i = 0; i < n; i++) {
for(j = 0; j < 6; j++) scanf("%d",a[i]+j);
for(j = 0; j < 6; j++)
for(k = 0; k < 6; k++) if(k!=j && k != f[j])
max(b[i][j], a[i][k]);
}
memset(dp, -1, sizeof(dp));
for(i = 0; i < n; i++)
for(j = 0; j < 6; j++) dp[1<<i][i][j] = b[i][j];
for (i = 0; i < kn; i++) {
for (j = 0; j < n; j++) {
for (k = 0; k < 6; k++) if(dp[i][j][k] != -1) {
for(p = 0; p < n; p++) if(!(i & (1<<p))) {
for (q = 0; q < 6; q++) if(a[j][k] == a[p][f[q]]) {
t = i|(1<<p);
max(dp[t][p][q], dp[i][j][k] + b[p][q]);
}//ifq
}//ifp
}//ifk
}//fj
}//fi
ans = 0;
for (i = 0; i < n; i++)
for (j = 0; j < 6; j++) max(ans, dp[kn-1][i][j]);
printf("%d\n", ans);
}
return 0;
}
銆愰鐩榪般戝憡璇夊鉤闈笂涓浜涚偣錛屼粠涓夋嫨閮ㄥ垎鐐瑰嚭鏉ワ紝瑕佹眰涓嶈兘閫夋嫨鐩擱偦鐨勭偣錛屾眰鎵鏈夌殑鏂規鏁般?/span>
銆愰鐩垎鏋愩戝榪?/span>gohst鈥?/span>wei鐨勪唬鐮侀鏍間箣鍚庯紝絎竴閬撳皬緇冨叺銆傝姳鐨勬椂闂磋櫧鐒墮暱浜嗙偣錛屼絾鏄紝鎰熻榪樹笉閿欍?/span>
1. 棣栧厛榪樻槸鍒嗘瀽閲囧彇鐢變笂鑰屼笅錛岄愯鍒嗘瀽鐨勭瓥鐣ャ?/span>
2. 鎴戜滑鍙戠幇錛屽獎鍝嶅綋鍓嶈鐨勭姸鎬佺殑鍙湁涓婁竴琛岋紝鍗充笂涓琛屽拰涓嬩竴琛岀殑瑕佹弧瓚崇浉閭諱笉鐩哥瓑鍘熷垯銆?/span>
3. 璁?/span> 琛ㄧず鍓?/span>i琛岀殑鏂規鏁幫紝涓旂i琛岀殑鐘舵佷負s.
杞Щ鏂圭▼錛?/span>
錛堝叾涓紝t涓轟笂涓琛岀殑鏌愪釜涓庡綋鍓嶈涓嶇浉鍐茬獊鐨勭姸鎬侊級
4. 鏃墮棿澶嶆潅搴︿負 鏄劇劧榪欐牱鐨勫鏉傚害涓轟笉婊¤凍鏉′歡鐨勩傚洜姝ら渶瑕佷紭鍖?/span>
5. 鎴戜滑鍙戠幇錛岄鐩腑鏈変竴涓檺鍒剁殑鏉′歡鏄病鐢ㄥ埌鐨勩傚氨鏄悓涓琛屼篃涓嶆弧瓚崇浉閭諱笉鍙彇鐨勩傜敱姝わ紝鎴戜滑鍙互瀹炵幇棰勫鐞嗭紝鍓旈櫎鎺夊浣欑殑鐘舵侊紝榪欐牱錛屾渶鍚庣殑姣忚鍚堟硶鐨勭姸鎬侊紝鏈澶氬彧鏈?/span>367涓?/span>
銆愰鐩唬鐮併戜笅闈㈡槸AC鐨勪唬鐮併?/span>
//Name: pku_3254_Corn Fields
#include <iostream>
using namespace std;
const int maxs = 1<<12;
const int mod = 100000000;
int map[13][13], n, m;
int stk[maxs], sn;
int dp[2][maxs];
inline bool one(int i, int j) { return (i&(~(1<<j))) != i;}
bool check(int i, int j) {
if (j > 0 && one(i, j-1)) return 0;
if (j < m-1 && one(i, j+1)) return 0;
return 1;
}
void Proced(int km, int m) {
sn = 0; int i, j;
for (i = 0,j; i < km; i++) {
for (j = 0; j < m; j++)
if(one(i, j) && !check(i,j)) break;
if (j == m) stk[sn++] = i;
}
// for (i = 0; i < sn; i++) printf("stk[%d] = %d\n", i, stk[i]);
}
void SCDP() {
int i, j, s1, s2, k1, k2, e1 = 0, e2 = 1;
for (j = 0; j < sn; j++) dp[0][stk[j]] = 0;
dp[0][0] = 1;
for (i = 1; i <= n; i++) {
for (j = 0; j < sn; j++) dp[e2][stk[j]] = 0;
for (k1 = 0; k1 < sn; k1++) {
for (k2 = 0; k2 < sn; k2++) {
s1 = stk[k1]; s2 = stk[k2];
if(s1 & s2)continue;
for(j = 0; j < m; j++)
if (!map[i][j] && one(s2, j)) break;
if (j == m) {
dp[e2][s2] = (dp[e2][s2]+dp[e1][s1])%mod;
}
}
}
e1 ^= 1; e2 ^= 1;
}
int ans = 0;
for (k1 = 0; k1 < sn; k1++)
ans = (ans + dp[e1][stk[k1]])%mod;
printf("%d\n", ans);
}
int main() {
freopen("in.in", "r", stdin);
scanf("%d %d", &n, &m);
Proced(1<<m, m);
for(int i = 1; i <= n; i++)
for (int j = 0; j < m; j++)
scanf("%d", map[i]+j);
SCDP();
return 0;
}
銆愰鐩榪般戞眰N錛?span>N<=10錛変釜瀛愪覆鐨勬渶鐭拰涓詫紝涓斾笉浼氬彂鐢熶竴涓?/span>瀹屽叏鍖呮兜鍙﹀涓涓殑鐜拌薄銆?/span>
銆愰鐩垎鏋愩戠畝鍗曠殑鐘舵?span>DP闂錛屼竴寮濮嬫兂鐢ㄥ瓧絎︿覆鐨勬濇兂瑙e喅錛屽彂鐜扮姸鎬佷箣闂達紝涓嶅ソ鍙樻崲銆傛濂借嚜宸卞仛鍘嬬緝DP鐨勪笓棰橈紝榪樻槸錛岀敤榪欎釜鏂規硶鍚э紒
1. 瀵逛簬姣忎釜瀛楃涓茬殑鏀劇疆錛屽拰濂規湁鐩存帴褰卞搷鐨勬槸涓婁竴涓瓧絎︾殑鏀劇疆鎯呭喌銆傜敱姝わ紝鎴戜滑鍙互寤虹珛涓涓姸鎬佽漿縐繪柟紼?/span>
璁?/span> 琛ㄧず褰撳墠鐘舵?/span>s浠ョi涓瓧絎︿覆緇撳熬浜х敓鐨勬渶灝忓拰涓茬殑闀垮害銆傚垯
2. 鑻?/span>s鍙寘鍚竴涓覆鐨勬椂鍊欙紝 鍏朵腑len[i]琛ㄧず絎?/span>i涓瓙涓茬殑闀垮害銆?/span>
3. 鍚﹀垯錛屽鏋滃綋鍓嶇殑鐘舵佸悎娉曪紝涓?/span>s鐘舵侀泦涓紝涓嶅寘鍚湁j涓詫紝閭d箞,錛?/span> 璁?/span>
a) 濡傛灉 鍏朵腑錛?/span>com[I, j] 琛ㄧず絎?/span>i涓覆涔嬪悗鏄j涓覆鐨勫叕鍏卞瓙涓茬殑闀垮害銆?/span>
b) 鍚﹀垯錛屼笉澶勭悊銆?/span>
4. 鏈鍚庣殑緇撴灉灝辨槸錛?/span> i鏄墍鏈夌殑瀛愪覆銆?/span>
銆愰鐩唬鐮併戯細
//Name: pku_1699_Best Sequence
#include <iostream>
#include <cstring>
using namespace std;
const int inf = 1<<20;
const int maxn = 1<<10;
char str[10][20];
int len[10], com[20][20], n, m;
int dp[maxn][10], ans;
void Link(int x, int y) {
int i, j, k, mlen = min(len[x], len[y]);
for (k = mlen; k >= 0; k--) {
for (i = len[x]-k, j = 0; i < len[x]; i++, j++)
if (str[x][i] != str[y][j]) break;
if (i == len[x]) {
com[x][y] = k; break;
}
}
for (k = mlen; k >= 0; k--) {
for (i = len[y]-k, j = 0; i < len[y]; i++, j++)
if (str[y][i] != str[x][j]) break;
if (i == len[y]) {
com[y][x] = k; break;
}
}
}
int main() {
// freopen("in.in", "r", stdin);
int t, i, j, s, r; scanf("%d", &t);
while(t-- && scanf("%d", &n)) {
memset(com, 0, sizeof(com));
for(i = 0; i < n; i++) {
scanf("%s", str+i);
len[i] = strlen(str[i]);
for (j = 0; j < i; j++) Link(i, j);
}
// for(i = 1; i < n; i++) printf("%d\n", com[i-1][i]);
for(i = 1; i < 1<<n; i++)
for (j = 0; j < n; j++) dp[i][j] = inf;
for(i = 0; i < n; i++) dp[1<<i][i] = len[i];
for(s = 1; s < 1<<n; s++) {
for (i = 0; i < n; i++) if(s&(1<<i)) {
for(j = 0; j < n; j++) if(i!=j && !(s&(1<<j))) {
r = s|(1<<j);
dp[r][j] = min(dp[r][j], dp[s][i] - com[i][j] + len[j]);
// printf("dp[%d][%d] = %d\n", r, j, dp[r][j]);
}
}
}
// for(i = 0; i < n; i++) printf("%d\n", dp[s-1][i]);
ans = inf;
for(i = 0; i < n; i++)
if (dp[s-1][i] < ans) ans = dp[s-1][i];
printf("%d\n", ans);
}
return 0;
}
銆愰鐩榪般戝憡璇変竴寮犲湴鍥撅紝鍦板浘涓婃湁N(2<=2<= 30)涓煄甯傦紝鐢變竴涓煄甯傚埌鍙﹀涓涓煄甯傜殑鍞竴浜ら氬伐鍏鋒槸椹濺錛屼笉鍚屽瀷鍙風殑椹濺鑺辮垂鐨勬椂闂達紙榪欓噷鐨勬椂闂磋綆楃敤涓ゅ湴鐨勮窛紱婚櫎浠ヨ椹濺楠傜殑鏁伴噺錛岄┈瓚婂瓚婂揩錛変笉涓鏍楓傜幇鍦ㄧ粰浣?/span>N(1<=N<=8)涓ら┈鏅紝姣忚締椹濺鍛婅瘔椹殑鏁伴噺錛屾眰鏈変竴涓煄甯傚埌鍙﹀涓涓煄甯傜殑鏈鐭椂闂淬?/span>
銆愰鐩垎鏋愩戝弬鑰冧簡hobby鐨勪唬鐮侊紝鍜?/span>froeverLin鎻愮ず錛屽湪榪欓噷浜堜互璇存槑銆?/span>
l 鍍忔槸涓涓渶鐭礬闂錛屼絾鏄鍔犱簡闄愬埗鏉′歡錛岃В娉?/span>DP姣嬪焊緗枒錛岀粰瀹氶┈杞︾殑鏁伴噺<= 8錛?/span> 鐘舵佸帇緙?/span>DP.
l 瑕佹眰鐨勪粎浠呮槸鏈鐭殑鏃墮棿錛屾病鏈夋眰鍒嗛厤鏂規錛岃繖鏃犵枒浣塊棶棰樼畝鍗曡瘽浜嗐?/span>
l 褰卞搷鑺傜偣錛堝煄甯傦級涔嬮棿鐨勮姳璐圭殑鍞竴鍙樺寲鍥犵礌鏄┈鐨勬暟閲忥紙璺濈鏄浐瀹氱殑錛夈?/span>
l 璁?/span> 琛ㄧず褰撳墠鐘舵佷負s錛岃蛋鍒板煄甯?/span>j鐨勬渶灝忔椂闂淬?/span>
鐘舵佽漿縐繪柟紼嬶紝涓?/span> 瀵逛簬浠諱綍涓涓笌j鐩歌繛鐨勮妭鐐?/span>k銆?/span>
鍏朵腑錛?/span> r涓哄拰k鐩歌繛鐨勫煄甯傦紝 r涓轟笉鍦?/span>s涓殑鏌愪釜椹濺鐨勫姞鍏ュ悗鐨勭姸鎬侊紝 t[w]涓鴻椹濺鐨勯┈鍖規暟銆?/span>
l 鍒濆鍖栭棶棰樸?/span>
n 鐢變簬姹傜殑鏄渶灝忓鹼紝鎴戜滑鍒濆鍖?/span>dp涓烘煇涓渶澶у箋?/span>
for(p = 1; p < (1<<n); p++)
for(i = 0; i < m; i++) dp[p][i] = inf;
n 鐢變簬姣忔閮芥槸浠?/span>a寮濮嬬殑錛屾墍浠ュ垵濮嬪寲鐨勬椂鍊欒鍒濆鍖栧拰a涓庡叧緋葷殑杈圭殑杞Щ銆?/span>
for (i = 0; i < m; i++) if(map[a][i] != -1)
for(k = 0; k < n; k++) dp[1<<k][i] = map[a][i]/t[k];
銆愰鐩唬鐮併?/span>
//Name: pku_2686_Traveling by Stagecoach
// dp[i][j]琛ㄧず褰撳墠浣跨敤鐨勭エ鐨勭姸鎬佷負i鍒拌揪浜?span>j鍩庡競鐨勬渶灝戠敤鏃?/span>
// 鑻ョk涓煄甯備笌j鐩歌繛閫氾紝涓旓紝鏋氫婦鏋氫婦紲ㄦ暟鏈灝戠殑
#include <iostream>
using namespace std;
#define inf 1<<30
int map[30][30];
int n, m, p, a, b, d, r, q;
double dp[1<<8][30], t[30], tmp, ans;
int main() {
// freopen("in.in", "r", stdin);
int i, j, k, x, y;
while(scanf("%d%d%d%d%d",&n,&m,&p,&a,&b) != EOF) {
if (!(n||m||p||a||b)) break;
a--; b--;
for(i = 0; i < n; i++) scanf("%lf", t+i);
memset(map, -1,sizeof(map));
for (i = 1; i <= p; i++) {
scanf("%d %d %d", &x, &y, &d); x--;y--;
map[x][y] = map[y][x] = d;
}
for(p = 1; p < (1<<n); p++)
for(i = 0; i < m; i++) dp[p][i] = inf;
for (i = 0; i < m; i++) if(map[a][i] != -1)
for(k = 0; k < n; k++)
dp[1<<k][i] = map[a][i]/t[k];
for (p = 1; p < (1<<n); p++) {
for (j = 0; j < m; j++) if(dp[p][j] != inf) {
for (k = 0; k < m; k++) if(k!=j && map[j][k]!=-1) {
for (r = 0; r < n; r++) if(!(p&(1<<r))) {
q = p + (1<<r);
tmp = dp[p][j] + map[j][k] /t[r];
if (dp[q][k] > tmp) dp[q][k] = tmp;
}
}
}
}
ans = inf;
for (p = 1; p < (1<<n); p++)
if(dp[p][b] < ans) ans = dp[p][b];
if(ans == inf) printf("Impossible\n");
else printf("%lf\n", ans);
}
}
|
|
|
|
鍐嶅洖棣?/p> 鍐嶅洖棣? 浜戦伄鏂綊閫? 鍐嶅洖棣? 鑽嗘瀵嗗竷/ 浠婂涓嶄細鍐嶆湁闅捐垗鐨勬棫姊?/ 鏇劇粡涓庝綘鍏辨湁鐨勬ⅵ / 浠婂悗瑕佸悜璋佽瘔璇?br>鍐嶅洖棣? 鑳屽獎宸茶繙璧? 鍐嶅洖棣? 娉溂鏈﹁儳/ 鐣欎笅浣犵殑紲濈/ 瀵掑娓╂殩鎴? 涓嶇鏄庡ぉ瑕侀潰瀵瑰灝戜激鐥涘拰榪鋒儜 銆銆銆銆鎯充簡瑙f垜鐨勶紝灝辮涓涓嬭繖綃囨枃绔犱簡錛岃涔嬪墠璇峰厛鎵撳紑闊充箰-銆婂洖棣栥嬪惉涓閬嶏紒 鍋剁劧鍚埌榪欓姝?---銆婂啀鍥為銆嬶紝鎰熻榪欓姝岀殑鏃嬪緥鏄偅涔堢殑鏌旓紝璁╂垜涓闃典箣鍚庯紝蹇冧腑縐仛鐨勬儏鎰熷啀涔熸棤娉曟帶鍒訛紝鍍忔椽姘磋埇瑕佺垎鍙戝嚭鏉ワ紒鍥為錛屽綋姝岃瘝涓嬈℃鐨勯噸澶嶈繖涓瘝鐨勬椂鍊欙紝鑷繁鍐呭績鐨勬繁澶勬湁璁稿涓滆タ鍦ㄨ爼鍔?--鏄蹇嗭紒 浠ュ墠鏈夎繃錛屼絾鏄病鏈夐偅涔堢殑寮虹儓榪囷紒涔熻鏄椂鍊?#8220;鍥為”涓涓嬩簡錛?/p> 鎴戞槸涓涓笉鍠勪簬澶勭悊鎯呮劅鐨勪漢錛屽綋鎯?#8220;鍥為”涓涓嬬殑鏃跺欙紝鍙嶈屽彂鐜頒笉鐭ラ亾浠庡摢閲屽紑濮嬩簡錛岃剳瀛愰噷涓鍥貢楹伙紒灝辨部鐫鎴戜笂瀛︾殑綰胯礬錛屾潵鍥為涓涓嬶紒錛堣璇嗘垜鐨勫厔寮燂紝鍒珜鎴戝敔鍙紝鎴戠粰鑷繁鍚殑錛佷笉涔犳儻錛屽牭涓婅蟲湹錛侊級 灝忓鐨勮蹇嗘槸鐝嶈吹鐨勶紝鍥犱負澶皯浜?澶у鐨勯兘蹇樿浜嗭紒錛堟劅鎱ㄥ瞾鏈堢殑寮哄ぇ鏉浼ゅ姏錛侊級璁板緱鎴戣笍榪涙牎鍥殑鏍¢棬鐨勬椂鍊欙紝鏄垜鐨?#8220;铏庡瓙鍝?#8221;棰嗙潃鎴戝幓鐨勶紒錛岄偅鏃跺欑殑鑷繁鍍忓彧閲庣尨瀛愶紙鍚垜铏庡瓙鍝ヨ鐨勶級錛屾暣澶╃┛涓婁覆涓嬬殑錛岃繕璁板緱絎竴嬈¤笍榪涙牎闂ㄧ殑鏃跺欓偅縐?#8220;楠勫偛鐨?#8221;蹇冩儏錛屾湁涓縐嶆棤娉曡█鍠葷殑鑷豹鎰燂紒榪樿寰楁牎闂ㄤ笂“濂藉ソ瀛︿範錛屽ぉ澶╁悜涓?#8221;閭e叓涓墦瀛楋紙铏界劧鏈変簺閿堣抗浜嗭紝浣嗘槸瀵規垜鏉ヤ功閭i噷闈㈡槸閭d箞鐨勭縐橈紒緇堜簬錛岃嚜宸辨鐫涓涓?#8220;鎺㈢”鐨勭洰鐨勶紝灝遍偅涔堢殑璧拌繘鍘諱簡錛佺粰鎴戠櫥璁扮殑鏍¢暱錛屽鍚村惂錛屽繕涓嶄簡浠栵紒鎴戝幓鎶ュ悕鐨勬椂鍊欙紝浠栦滑鍑犱釜“澶т漢”姝e湪鍚冭タ鐡滐紒鎴戠珯鍒頒粬闈㈠墠鐨勬椂鍊欙紝涓ょ溂鐩村嬀鍕劇殑鐩潃浠栨墜閲岀殑涔犳儻錛屼粬鍙兘鎰熻灝村艾鍟︼紝榪炲繖璇?#8220;灝忓浼欙紝鏉ュ悆鍧楋紒“錛屼絾鏄垜鏋滄柇鑰屼笖鍧氬喅鐨勬嫆緇濅簡錛佷粬璇存垜鏈夌ぜ璨岋紝鑰屽疄闄呬笂鍛紵鐜板湪鍙互璇翠簡錛?#8221;浠栫粰鎴戠殑鏄タ鐡滄湁涓澶氬崐鏄敓鐨勶紝浣犺鎴戝悆錛屾垜鍌誨晩!錛?#8221;鍛靛懙 灝忓鐨勮蹇嗘槸鐭殏鐨勶紝浣嗘槸錛屼粎鏈夌殑璁板繂閮芥槸鐢滅編鐨勶紒鎴戣繖杈堝瓙涔熶笉浼氬繕璁幫紝鍥犱負閭i噷鏈夋垜澶绔ュ勾鐨勬絎戜簡錛?鎻愪竴涓嬫垜灝忓鐨勫摜浠効錛?/p> 鍥藉崕鈥斺旀垜灝忓鐨勯搧鍝ヤ滑錛岃儢鑳栫殑錛屼負浜虹儹鎯咃紝鐖辨墦鎶變笉騫籌紝灝忓閲屽府浜嗘垜涓嶅皯錛?/p> 寮犵惁鈥斺旀尯濂界殑鍚嶅瓧錛屽ソ鏈嬪弸錛佹垜浠竴璧峰害榪囦簡涓嶅皯鏃跺厜錛?/p> 鑵撅紝鍑紝鎵嶏紝鎴戜竴杈堝瓙鐨勬湅鍙嬶紒 榪樻湁鍑犱釜涓嶆槸寰堜織鐨勶紝浣嗘槸緇欐垜褰卞搷寰堝ぇ鐨勶紒鎴戝皬瀛︾殑鐝暱錛堜綍錛氬綋浜嗕簲騫寸殑鐝暱錛岃緵鑻﹀ス浜嗭紒錛夛紝鎸烘暚浣╁ス鐨勶紝涓涓皬濂沖鎶婁竴緹?#8220;灝忛噹瀛╁瓙”綆′綇錛屼笉瀹規槗鍟婏紒鍒橈細瀵逛笉浣忓ス鐨勶紝鏇炬妸濂規児鍝簡錛岃繕鍙簡濂瑰闀匡紒錛堝悗璇濓紝濂規垚浜嗘垜楂樹腑鍚屽錛侊級寰愶細鍚庤瘽浜嗭紒 涓嶈鍋滈】錛岃鎴戜滑緇х畫寰鍓嶈蛋錛佸埌鍒濅腑浜嗭紒鍒濅腑鐨勬椂鍊欙紝鏄垜瀛︿範鏈鍒昏嫤鐨勬椂鍊欙紙涓嶆槸鎴戣鐨勶紝鏈嬪弸浠鐨勶紝鍏跺疄鎴戞病鎰熻錛夈傚湪鍒濅腑錛屾垜閬囧埌浜嗙粰鎴戝惎鍙戞渶澶х殑錛屽獎鍝嶆渶娣辯殑鑰佸笀錛孧r 寰愶紝 Mr 鐒︼紒寰愯佹槸鎴戠殑鑰佺彮錛屾墍浠ヤ粬瀵規垜瑕佹眰鏄緢涓ョ殑錛屼絾鏄粰鎴戠殑鍚開涔熸槸鏈澶х殑錛佹垜涓嶆槸涓涓仾鏄庣殑浜猴紝浣嗘槸錛屾垜閭f椂鍊欐槸涓涓嫟濂嬬殑浜猴紒浠栧憡璇夋垜鐨?#8220;瀹濆墤閿嬩粠紓ㄧ牶鍑猴紝姊呰姳棣欒嚜鑻﹀瘨鏉ワ紒”銆傞偅鏃跺欑殑鑷繁姣旂幇鍦ㄦ噦寰楅偅鏄粈涔堟剰鎬濓紒鐜板湪鎯蟲兂鎸轟僵鏈嶈嚜宸辯殑姣呭姏鐨勶紒鍥犱負鎴戝仛鍒頒簡鍒漢鍋氫笉鍒扮殑錛屾墍浠ヤ篃寰楀埌浜嗗埆浜哄緱涓嶅埌浜嗭紙涓嶆槸瀵硅仾鏄庝漢璇寸殑錛屾垜璇寸殑鏄儚鎴戜竴鏍鋒剼閽濈殑浜猴級銆傜劍鑰侊紝鎬庝箞璇村憿錛熷緪鑰佹槸鎵撴垜鏈閲嶇殑浜猴紝浠栨槸楠傛垜鏈鐙犵殑錛侊紙浜嬪疄濡傛錛?榪樿寰椾竴浠朵簨錛岄偅鏃跺欐垜鐨勫瓧浣撳啓鐨勫皬錛岋紙浠栧彲鑳芥槸鎯寵鎴戝啓澶т簺錛夋湁涓嬈′笂璇懼氨鍦ㄨ涓婏紝鍦ㄩ粦鏉夸笂鐢ㄧ矇絎旇姳浜嗕竴涓ぇ澶х殑“鐢?#8221;瀛楋紙浠ュ墠鐨勪綔涓氭湰錛夛紝鐒跺悗鐢ㄧ矇絎斿啓浜嗕笁涓皬灝忓皬鐨勪笁涓瓧錛堟垜鍚嶅瓧錛岀粷瀵規槸璁藉埡錛岃繕濂芥槸鎴戯紝蹇冮噷绱犺川閭d箞濂界殑錛岃涓嶄及璁℃棭“浠ュご寮哄湴"浜嗭紒錛変絾鏄垜榪樻槸浠庝粬韜笂瀛﹀埌浜嗗鑷繁鐨勪弗鏍艱姹傦紝榪欒鎴戝彈鐢ㄧ粓韜殑錛侊級鎴戜笉浼氬繕璁頒粬浠紒灝嗘潵鏈夋椂鍊欏洖鍘葷湅鐪嬶紝瀛︽牎鏄病浜嗭紝浣嗘槸甯堢敓鎯呰繕鍦紒 銆銆 鍒濅腑鐨勬湅鍙嬪氨鐩稿杈冨浜嗭紝鑰屼笖榪樹氦鍒頒簡鎴戜竴杈堝瓙鐨?#8220;鍏勫紵”錛堝埆絎戯紝鎴戞病澶稿ぇ錛岃儲紲炵埛闈㈠墠鎵h繃澶達紝閭靛浗棣欑殑錛佹垜鑰佸ぇ錛屽皬涔夎佷簩錛岄瞾瀛愯佷笁錛夛紝鎴戜箞涓璧峰害榪囦簡寰堝蹇箰緹庡ソ鐨勬椂鍏夛紝鑰屼笖鐢辨棤灝界殑嬈㈠0絎戣錛岃鎴戠殑鍒濅腑鐢熸椿鏄偅涔堢殑浠や漢闅懼繕錛佽櫧鐒跺悗鏉ユ垜浠垎寮浜嗭紝浣嗘槸錛屽厔寮熸儏璋婃槸鏂╀笉鏂殑錛両 Believe I Can! 榪樻湁娌$榪囧ご錛屼絾鏄叧緋誨悓鏍峰緢濂界殑錛屽嚑涓細闃胯儭錛堣涔夋皵鐨勫ソ鍝ヤ滑錛夛紝灝忔湵錛堝悓鏍風殑濂芥湅鍙嬶級錛佽彶錛岀幆錛屽悓鏍風殑濂?#8220;鍏勫紵"(涓や釜濂崇敓錛屽彨鍏勫紵鏄鍏崇郴濂斤紝鍒浼氾紒錛夎繕寰楁彁涓涓嬶細灝忚秴錛岀彮閲屾渶浼氭悶鐨勶紝緇欐垜甯︽潵浜嗗緢澶氭絎戯紒 榪樻湁寰堝錛屽氨涓嶈鍟︼紝浠栦滑涔熸槸鎴戠殑濂芥湅鍙嬶紒 銆銆銆銆鍒濅腑鐨勭敓媧繪槸鍏呭疄鐨勶紝鏄厖婊℃絎戠殑錛屼絾鏄紝涔熻繕鏈変竴浜涙棤娉曞譏琛ョ殑閬楁喚浜?浠ュ墠鐨勮嚜宸卞彧鍠滄鏁村ぉ鍩嬪湪涔﹂噷錛屾墍浠ワ紝閿欒繃浜嗗ソ澶氾紝涔熸棤璦閲屼激榪囦簡涓浜涗漢錛佹垜鐭ラ亾涓鍙?#8220;瀵逛笉璧?#8221;錛屾槸榪樹笉鍥炴潵浠涔堢殑錛屼絾鏄紝鍗存槸鎴戝績閲屾唻浜嗗嚑騫寸殑璇濓紝濂藉嚑嬈℃兂璇存潵鐫錛屽嵈鍙堟曟彁璧蜂簡錛屽弽鑰屾洿浼ゅ績錛佺敤鐢靛獎閲岀殑涓鍏峰鐧斤細璁╁ス鐣欏湪璁板繂閲屽惂錛乄ish you have a happiness life , 寰愶紒 銆銆銆 鎶涘紑鎯嗘咃紝鎶涘紑澶氭儏錛佹垜紱誨紑浜嗗垵涓紝鏉ュ埌浜嗛珮涓紒楂樹腑鐨勭敓媧誨簲璇ヨ鏄蹇嗛噷鏈娓呮櫚鐨勶紝浣嗘槸錛岄偅鍗存槸鎴戞渶涓嶆効鎰忚璧風殑錛侀珮涓殑鐢熸椿錛屾垜鐨勪粠灞遍《璺屽掍簡灞卞簳錛佸績涓殑鍘嬫姂錛岄儊闂鳳紝鍫曡惤錛岃嚜鏆磋嚜寮?#8230;…涓鍒囦笉濂界殑璇嶏紝閮藉彲浠ョ敤鏉ュ艦瀹規垜鐨勶紒榪欐椂鎴戣蛋鍒頒簡鑳屽彌鐨勯《宄幫紝浠夸經榪欎釜涓栫晫鐨勪竴鍒囬兘鏄垜鐨勭溂涓埡錛屼笉欏虹溂錛佸綋鐒訛紝鎵璋?#8220;鎴愮嘩”涔熶笉鏄緢濂斤紒涓婁笉鍘伙紝鍙堜笅涓嶆潵錛屾垜灝卞湪閭i噷鎸傜潃錛佸帇鍔涗篃寰堝ぇ錛佷絾鏄緢鍗遍櫓鐨勶紝鍥犱負涓鏃﹀鐏儲琚偣鐕冿紝灝嗕竴鍙戜笉鍙敹鎷撅紒緇堜簬錛岄珮浜岋紝濂跺ザ鐨勫幓涓栵紝璁╂垜褰誨簳鐨勫穿婧冧簡錛佹垜褰誨簳鐨勫け鍘諱簡淇″績錛佷竴涓漢浠涔堟椂鍊欐渶鍙曪紝灝辨槸浠栧鑷繁澶卞幓淇″績鐨勬椂鍊欙紒浣嗘槸鎴戞槸騫歌繍鐨勶紝褰撴垜鏈緇濇湜鐨勬椂鍊欙紝濂圭殑瀹夋叞璁╂垜紼嶆劅鑸掗傦紒娓愭笎鐨勬貳蹇樹簡錛佺瓑鎴戝交搴曟竻閱掔殑鏃跺欙紝宸茬粡鏄珮涓夌殑涓嬪崐瀛︽湡錛屽崌瀛︾殑鍘嬪姏鏈変竴嬈″帇鍒頒簡鎴戣偐涓婏紒榪樺ソ鑷繁榪樺彲浠ュ姫鍔涳紒 銆銆銆銆絎竴嬈$殑澶辮觸錛岃鎴戠浜屾瑙夋偀錛佷唬浠烽珮浜嗙偣錛屼絾鏄尯榪囨潵浜嗭紒鍥炲繂灝辯涓嶅紑浜虹殑錛佽繖涓漢錛屾槸鎴戣繖杈堝瓙閮藉彲浠ヤ氦蹇冪殑錛屽緩搴鳳紝鎴戠殑鎸氬弸錛侀櫔鎴戣蛋榪囦笁騫磋礬紼嬬殑浜猴紒鑰屼笖濮嬬粓鏄湪鏀寔鐗╁摝鐨勪漢錛佸ソ鍏勫紵錛屽厔寮熸垜浠涔堜篃涓嶈浜嗭紒 楣忥紝璁╂垜鍙綘澹板摜錛屼笉浜忥紒 鑺籌紝璋㈣阿浣狅紒鑻辮鑰佸笀錛岃阿璋綘緇欐垜鍕囨皵錛岃鎴戝媷浜庨潰瀵癸紒瀛︾敓涓嶄細蹇樿鎮紒鐢熺墿鑰佸笀錛堟垜澶嶈鐨勬椂鍊欑殑鑰佸笀錛夛紝璋㈣阿浣犵殑榧撳姳錛?/p> 銆銆銆銆浜虹敓鐨勫畬緹庡氨鍦ㄤ簬濂圭殑涓嶅畬緹庯紒甯︾潃浜涜鐨勯仐鎲撅紝鎴戣笍涓婁簡鍗楀幓鐨勭伀杞︼紝鍘諱笂鎴戠殑澶у錛佽櫧鐒朵竴璺笂澶鐨勫潕鍧鳳紝浣嗘槸錛屾垜榪樻槸鏉ュ埌浜嗭紒澶у錛岀粰鎴戠殑絎竴鍗拌薄灝辨槸“澶?#8221;錛屼漢“澶?#8221;錛佷竴寮濮嬫潵澶у鑷繁瀵瑰ぇ瀛︽湁浜涘け鏈涚殑錛岀數瑙嗛噷鐨?#8220;鏁欐巿瀛﹁?#8221;錛屽潗鍦ㄦ牎鍥噷鍒板鍙鐨勫満鏅紝鎴戜粠娌$湅鍒拌繃錛佹縺鎯呮磱婧㈢殑鎰ら潚鍒板浣滄紨璇寸殑鍦洪潰錛屼豢浣涙案榪滃畾鏍煎湪灝忚閲屼簡錛佽繖浜涘彧鏄〃闈紝鎴栬娌℃湁涔熸病浠涔堬紒浣嗘槸……鍦ㄥ鐢熶細甯﹁繃鍗婂勾涔嬪悗錛屽彂鐜?#8220;澶鐨勫お澶氱殑浜嬫儏涓栦織璇濆暒錛佽繕涓嶄粎濡傛錛屾洿鍙偛鐨勬槸錛屽鏍$珶鐒墮偅榪欎簺涓滆タ鐐錛佹嬁鐫涓浜涙湰鏉ュ氨搴旇鏈夋垨鍋氱殑浜嬫儏鐐錛屼竴浜涗笉鐭ラ亾浜嬫儏鐨勪漢錛岃繕鐪熺殑鑷互涓?#8220;濂?#8221;錛佷笉璇磋繖浜涗簡錛岀粡榪囦竴浜涜糠鑼箣鍚庯紝鎴戝湪鑼尗鐨勫ぇ嫻蜂笂錛岃繕鏄湅鍒頒簡“鍖楁瀬鏄?#8221;錛堝寳鏋佹槦姘歌繙鎸囩潃鍖楁柟錛?-瀛︽牎acm錛佽繖璁╂垜鎰熻鍒幫紝榪樻槸鏈夊摢涔堜竴涓湴鏂癸紝鍍忔垜鎯蟲兂閭f牱錛岃繙紱諱笘淇楋紝鍏呮弧瀛︽湳鐨勬皼鍥淬傛垜涓鴻嚜宸辮兘榪涘埌榪欎箞涓涓粍緇囨劅鍒板簡騫革紒鍛ㄨ佸笀錛屽簲璇ユ槸鎴戠殑澶у閲岀殑鎭╁笀浜嗭紒浠栨棤縐佸鐚殑綺劇錛岃浜ゅぇ鑽h錛岃浜ゅぇ鏌愪簺鑰佸笀鎯劎錛佹垜涓嶆槸鍚瑰槝錛屼笉淇★紝浣犲彲浠ヨ嚜宸辨潵鐪嬶紒 銆銆璁╂垜浠洖鍒扮幇鍦紒 鏉ヤ氦澶т竴騫村浜嗭紝涓鍒囪繘琛岀殑騫舵病鏈夊澶х殑寮傚父錛佷絾鏈変竴鐐規垜瑙夊緱鑷繁浜ゅ埌鐨勬湅鍙嬪お灝戜簡錛佸彲鑳芥槸紱誨澶繙鐨勭紭鏁咃紝榪欓噷涔堟湁鍚屽錛岀己灝戜氦蹇冪殑鏈嬪弸錛佸績閲岃瘽涓嶇煡閬撹鍜岃皝璇達紒鎴戞病鏈夎繃閭d箞榪垏鐨勬兂浜ゆ湅鍙嬬殑蹇冩儏錛佹垜甯稿父鎯崇潃錛岀瓑鍒拌嚜宸辮佺殑鏃跺欙紝鑳藉惁鎯寵搗鑷繁澶у鏃跺厜鎬庝箞榪囩殑錛屾湁娌℃湁閭d箞鍑犱釜鍙互縐板緱涓婁竴杈堝瓙鐨勬湅鍙嬶紒鎴戞兂浼氭湁鐨勶紒澶у閲岄潰浠涔堥兘瑕佸潎琛★紝鏃墮棿涔熸槸錛屼笉鑳芥妸鏃墮棿鍏ㄩ兘鎶曞叆鍒拌嚜宸卞枩嬈㈢殑浜嬫儏涓婂幓銆備互鍓嶈嚜宸卞お鍋忔縺浜嗭紝瀵瑰ぇ瀛﹂噷鏈鍊煎緱瀛︿範鐨勪竴闂ㄧ煡璇嗙枏蹇戒簡“浜ゅ弸……鍙嬭皧”錛佹暈寮蹇冩墘鍚э紝鏈嬪弸錛佷漢鍜屼漢涔嬮棿闇瑕佺殑鏄矡閫氾紒 銆銆銆鍥為鑷繁鐨勮繃鍘伙紝鎴戞槸騫歌繍鐨勶紝鎴戝洶鎯戠殑楗挎椂鍊欙紝鎬繪湁閭d箞鍑犱釜鑰佸笀鎴栨湅鍙嬶紝鏀寔鎴戯紝緇欐垜璧頒笅鍘葷殑鍕囨皵錛岃鎴戝浼氬緢澶氱敓瀛樼殑娉曞垯鍜屾妧鑳斤紒鎴戜笉瀛ょ嫭瀵傚癁鈥斺斿弽椹充竴浜涗漢鎷胯繖涓拰鎴戝紑鐜╃瑧鐨勶紝鎴戝彧鏄弽鎯滄垜浠箣闂村緩绔嬬殑鍙嬭皧錛?#8220;寰呬漢瑕佺湡錛屼氦鍙嬩氦蹇冿紒”
銆銆銆銆 銆銆銆銆鍞犲敔鍙ㄥ彣浜嗚繖涔堝錛屼笉涓哄埆鐨勶紝鍙槸鏈夋劅鑰屽彂錛岃繖涓ゅぉ緇欏ソ鍑犱釜浜鴻繃浜嗙敓鏃ワ紝榪囦竴嬈$敓鏃ュ氨浠h〃鎴戜滑鍙堥暱澶т竴宀侊紝灝辮鎳傜偣浜嬪効錛佹槑澶╂槸鎴戠殑鐢熸棩錛屾垜鎶婅繖涓婂洖棣栥嬮佺粰鑷繁錛佷笉涓哄埆鐨勶紝涓虹殑鏄嚜宸辮兘鍕囨暍鐨勫悜鍓嶇湅錛?/p> |
|
|
Dragon(灝忓織)
|
|
棰樼洰閾炬帴錛?/p> pku_1850_Code_ http://162.105.81.212/JudgeOnline/problem?id=1850 pku_1496_Word Index http://162.105.81.212/JudgeOnline/problem?id=1496 銆愰棶棰樻榪般戯細緇欏畾涓涓暱搴︿負N(n<=10)鐨勭敱灝忓啓瀛楁瘝緇勬垚鐨勫瓧絎︿覆錛?br>濡傛灉璇ュ瓧絎︿覆宸﹁竟鐨勫瓧絎﹂兘姣斿彸杈圭殑瀛楃鐨勫瓧鍏稿簭澶э紝鍒欐垜浠О榪欎釜瀛楃涓叉槸鍚堟硶鐨勶紝 e.g: 瀛楃涓詫細abc ade 鏄悎娉曠殑錛岃屽瓧絎︿覆錛歜ac bca dae 鍒欐槸涓嶅悎娉曠殑銆?/p> 鐜板湪瀵瑰悎娉曠殑瀛楃涓茶繘琛屽涓嬬殑緙栫爜錛堢紪鍙鳳級錛?br>a - 1 銆愰棶棰樺垎鏋愩戯細棣栧厛鎯沖埌鐨勫簲璇ユ槸鏆村姏錛屼絾鏄毚鍔涚殑澶嶆潅搴︿細杈懼埌O(10^26)錛屽彲鑳戒細瓚呮椂錛屽綋鐒舵湁浜虹垎榪囦簡銆?br>榪欓噷灝嗕竴涓洿涓洪珮鏁堢殑綆楁硶銆傚厛鐪嬩竴涓嬭繖涓浘錛?img style="WIDTH: 215px; HEIGHT: 79px" border=0 alt="" align=right src="http://m.shnenglu.com/images/cppblog_com/dragon521/a.png" width=215 height=79> 璁緎[k][i](0< i<= 26)琛ㄧず闀垮害絳変簬k鐨勫悎娉曚覆浠ュ瓧姣?i+'a'-1)寮澶寸殑涓茬殑鏁扮洰錛屽垯瑙勫畾s[k][26]琛ㄧず闀垮害涓簁鐨勯泦鍚堢殑鍚堟硶涓茬殑鎬葷殑涓暟銆傚浜庣粰瀹氱殑闀垮害涓簄鐨勫瓧絎︿覆錛屾垜浠敱鍙沖悜宸﹁冭檻錛屾壘絎琲涓瓧絎﹀拰絎琲-1涓瓧絎︾殑鍏崇郴錛氫護tmp = s[ k ][ str[i] - 1] - s[k][ str[i-1] ]錛岃〃紺哄湪鍓峣-1涓瓧絎︿笉鍙樻椂錛屽彲寰楀埌鐨勪笉鍚岀殑鏂板悎娉曞瓧絎︿覆鐨勪釜鏁般傚浜庣涓涓瓧絎︼紝鎴戜滑瑕佸垽鏂ス鏄笉鏄涓涓瓧姣?#8216;a',涓嶆槸鐨勮瘽錛屽ス鍙互寰楀埌鐨勫績鍚堟硶瀛楃涓茬殑涓暟涓簊[k][str[0]-1]. 鏈鍚庣殑璇濓紝鎴戜滑鍐嶆妸鎵鏈夐暱搴﹀皬浜巒鐨勫瓧絎﹂暱鐨勪釜鏁板姞璧鋒潵灝辨槸鎴戜滑瑕佹眰鐨勶細涓嬮潰鏄畝鍗曠殑浠g爜錛屼緵澶у璁ㄨ浜ゆ祦錛?/span> #include <iostream> #include <string.h> using namespace std; const int maxn = 28; int s[11][maxn], n; bool isValid(char *s, int &n) { int i = n = 0; for(i = 1; s[i]; i++) if(s[i] <= s[i-1]) return 0; n = i; return 1; } void init() { s[0][27] = 1; for (int k = 1; k < 11; k++) { int m = 26-k+1; for (int i = 1; i <= m; i++) { s[k][i] += s[k][i-1] + s[k-1][m+1]-s[k-1][i]; } } s[0][27] = 0; } void pt() { int sum = 0; for (int k = 1; k < 11; k++) { int m = 26-k+1; for (int i = 1; i <= m; i++) { printf("s[%d][%d] = %d\n", k, i, s[k][i]); } sum += s[k][m]; } printf("%d\n", sum); } inline int d(char c) { return c-'a'+1;} int main() {//freopen("in.in", "r", stdin); init(); //pt(); char str[11]; int m, i, k; while(scanf("%s", str) != EOF) { if (!isValid(str, n)) { puts("0"); continue;} for (i = n-1, k = 1, m = 1; i >= 1; i--, k++) m += s[k][d(str[i]-1)] - s[k][d(str[i-1])]; if (str[0] != 'a') m += s[k][d(str[0]-1)]; for (i = 1; i < k; i++) m += s[i][26-i+1]; printf("%d\n", m); } return 0; } |
|
|
/*================================================================================================*\ | Gauss娑堝厓綆楁硶姹傝В寮鍏崇伅闂 \*================================================================================================*/ 寮鍏抽棶棰橈細鏈塏涓浉鍚岀殑寮鍏籌紝姣忎釜寮鍏抽兘涓庢煇浜涘紑鍏蟲湁鐫鑱旂郴錛屾瘡褰撲綘鎵撳紑鎴栬呭叧闂煇涓紑鍏崇殑鏃跺欙紝鍏朵粬鐨勪笌 瀵逛簬榪欑被闂錛屽閥濡欑殑榪愮敤浣嶈繍綆楀拰gauss綆楁硶鍙互楂樻晥鐨勮В鍐熾?/p> ---------------------------------------------------------------------------------------- 寮鐏棶棰樺憡璇塏(N<=63)鐩忕伅鍜孧(M<=N)涓紑鍏?姣忎釜寮鍏沖彲浠ユ帶鍒禟(K<=N)鐩忕伅錛岀粰瀹歂鐩忕伅鐨勫垵濮嬬姸鎬丼鍜?br>瑕佹眰閫氳繃寮鍏蟲帶鍒跺緱鍒扮殑鐩爣鐘舵丒錛屾眰鍙互杈懼埌鐩爣鐘舵佺殑鏂規鏁般?/p> ---------------------------------------------------------------------------------------- 綆鍗曞垎鏋愶細瀵逛簬姣忎釜寮鍏籌紝鏈夋寜鍜屼笉鎸変袱縐嶉夋嫨錛堣涓?/1錛? 瀵逛簬姣忕洀鐏湁鍙樺拰涓嶅彉涓ょ鎯呭喌錛?/1錛?濡傛灉鍒濇佸拰緇堟佷笉涓鏍?br>錛岄偅涔堣繖鐩忕伅鏄竴瀹氳鍙樺寲鐨勩傜敱姝ゆ垜浠氨鍙互寰楀埌涓涓?/1鐨勭煩闃碉細璁㎞鐩忕伅鐏綔涓哄垪鍚戦噺錛屽紑鍏充綔涓烘í鍚戦噺錛屾妸姣忕洀鐏槸鍚﹀彉鍖?br>浣滀負絎琈鍒楋紙鐢?寮濮嬶級榪欐牱灝卞緱鍒頒竴涓狽*(M+1)鐨勭煩闃?璇ョ煩闃墊湁濡備笅鎬ц川錛?/p> 1. 濡傛灉N = M 錛岄偅涔堢煩闃典負澧炲箍鐭╅樀銆?/p> 2. 璇ョ煩闃電浉褰撲簬鏂圭▼緇凙 * X = B,鍥犳鍙互姹傚叾瑙c?/p> 1. 鑻ユ柟紼嬬粍鏈夊敮涓瑙o紝閭d箞錛孨 = M (閫嗗懡棰橈細濡傛灉M = N ,閭d箞鏂圭▼緇勬湁鍞竴瑙?涓嶆垚绔? 2. 鑻ユ柟紼嬬粍鏃犲疄鏁拌В錛岄偅涔堬紝璇ユ柟紼嬩笉鍙互鍖栨垚涓ユ牸涓婁笁瑙掑艦寮忥紙鍏蜂綋鐨勮瘉鏄庤鐩稿叧璧勬枡錛岃繖閲屼笉鍐嶈瘉鏄庯級 3. 鑻ユ柟紼嬬粍鏈夊鎺ワ紝鍗沖瓨鍦ㄨ嚜鐢卞彉鍏冿紝鍥犱負姣忎釜鑷敱鍙樺厓鍙互鍙?/1涓ょ鎯呭喌錛岄偅涔堟誨叡鏈?^m(m涓哄彉鍏冩暟)瑙?br>(涔熷氨鏄笉褰卞搷鏈鍚庣粨鏋滅殑鑷敱寮鍏崇殑鏁扮洰錛?/p> 涓嬮潰鏄粡榪囬獙璇佺殑浠g爜錛?/p> int getRow(int p, int q, int &row) { for (int i = p; i < n; i++) if (!zero(a[i][q])) return a[row=i][q]; return row=0; } void swapRow(int p, int row, int q) { for (int k = q; k <= m; k++) swap(a[p][k], a[row][k]); } i64 gauss() { int i = -1, j = -1, k, p, q, ret, row; while(++i < n && ++j < m) { ret = getRow(i, j, row); if (zero(ret)) { i--; continue;} if (row != i) swapRow(i, row, j); for (p = i+1; p < n; p++) if (a[p][j]) for (q = j; q <= m; q++) a[p][q] ^= a[i][q]; } for (k = i; k < n; k++) if(a[k][m]) return -1; return (i64)1 << (m-i); } //link: hdu3364 http://acm.hdu.edu.cn/showproblem.php?pid=3364 ---------------------------------------------------------------------------------------- 寮鍏抽棶棰橈細鏈塏涓浉鍚岀殑寮鍏籌紝姣忎釜寮鍏抽兘涓庢煇浜涘紑鍏蟲湁鐫鑱旂郴錛屾瘡褰撲綘鎵撳紑鎴栬呭叧闂煇涓紑鍏崇殑鏃跺欙紝 ---------------------------------------------------------------------------------------- 榪欑被闂鏄笂闈㈤棶棰樼殑涓縐嶇畝鍖栵細 瀵逛簬闂涓銆佸彲浠ョ洿鎺ュ鐢ㄤ笂闈㈢殑鍏紡錛圢=M錛?/p> 瀵逛簬闂浜屻佸鏋滄瀯閫犲緱鍒扮殑鏂圭▼緇勫彧鏈変竴涓В錛岄偅涔堥棶棰樿В鍐籌紝榪欓噷涓昏璁ㄨ涓涓嬪瑙o紝 涓嬮潰鏄畝鍗曠殑鏋氫婦鑷敱鍏冪殑綆楁硶銆?/p> int gans(int a[][maxn+1]) { int i, j, ret = a[n-1][n]; for (i = n-2; i >= 0; i--) { for (j = i+1; j < n; j++) a[i][n] ^= a[i][j] && a[j][n]; ret += b[i][n]; } return ret; } void dfs(int p, int k) { if (p == k) { memcpy(b, a, sizeof(b)); int ret = gans(b); if (ret < ans) ans = ret; return; } a[p][n] = 1; dfs(p-1, k); a[p][n] = 0; dfs(p-1, k); } int gauss() { //……浠g爜瑙佷笂錛坣=m錛?#8230;…// dfs(n-1, i-1); return ans; } Link: pku_1222 http://162.105.81.212/JudgeOnline/problem?id=1222 pku_1681 http://162.105.81.212/JudgeOnline/problem?id=1681 pku_1753 http://162.105.81.212/JudgeOnline/problem?id=1753 pku_1830 http://162.105.81.212/JudgeOnline/problem?id=1830 pku_3185 http://162.105.81.212/JudgeOnline/problem?id=3185 |
|
|
//Name: pku_1753_Flip Game //Author: longxiaozhi http://hi.baidu.com/xiehuixb/blog/item/9ce25f10ee8a2e77ca80c4d1. //Root: 鍜屽墠闈㈢殑pku1681涓涓剰鎬?span>,浣嗘槸錛屾祴璇曟暟鎹姞寮轟簡錛佽繖涓鐩渶瑕佽冭檻鑷敱鍏冿紒錛佷篃灝辨槸鎴戜互鍓嶇殑gauss鐨勬墍鍦紝 //榪欎釜闂涓鐩村洶鎵頒簡鎴戜袱澶╁ぉ銆備互鍓嶇殑棰樼洰鐨勬祴璇曟暟鎹ソ鍍忓茍娌℃湁鑰冭檻榪欎竴鐐癸紝鎵浠ュ彲浠ユ按鏋滃幓錛屼絾鏄繖涓鐩氨涓嶈鍟︺?/span> //浣嗘槸錛岃繕鏄彲浠ョ敤gauss鐨勭畻娉曡В鍐崇殑銆傚鏋滀笉瀛樺湪鑷敱鍙樺厓錛岄偅涔堣鏄庡師鏂圭▼緇勫彧鏈変竴緇勮В錛屼篃灝辨槸鎴戜滑瑕佹眰鐨勶紱 //濡傛灉瀛樺湪鑷敱鍙樺厓錛屽垯璇存槑鎴戜滑姹傞亾鐨勬柟紼嬬殑瑙e彧鏄叾涓殑涓縐嶆儏鍐碉紝浣嗕笉涓瀹氭槸鏈浼樼殑銆?/span> //涓嬈℃垜浠繕瑕佽冭檻鑷敱鍙樺厓鍥犱負鎴戜滑姹傚嚭鏉ョ殑鐭ヨ瘑婊¤凍鏉′歡鐨勪竴縐嶈В錛屽茍涓嶆槸榪欓噷瑕佹眰鐨勬渶浼樿В銆?/span> //鎴戜滑瑕佽冭檻鑷敱鍙樺厓鐨勫彇鍊鹼細 //姣忎釜鑷敱鍏冩垜浠兘鏋氫婦濂圭殑鍊鹼紙鎴栵級璁╁悗榪涜涓嬈℃繁鎼滃氨鍙互鎶婅嚜鐢卞厓鐨勬儏鍐靛姞榪涘幓錛屾濡?span>xiehui鍗氬閲屽啓鐨勪竴鏍楓?/span> #include <iostream> #include <string.h> using namespace std; #define eps 1e-10 #define fabs(x) ((x)>0?(x):-(x)) #define zero(x) (fabs(x) < eps) const int maxn = 16; int a[maxn][maxn+1], b[maxn][maxn+1]; int n, m, ans; const int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; inline int isBound(int a, int b) { return a < 0 || a >= m || b < 0 || b >= m; } void pmat(int a[][maxn+1]) { for (int i = 0, j; i < n; i++) { for (j = 0; j < n; j++) printf("%d ", a[i][j]); printf("%d\n", a[i][j]); } } void pans(int a[][maxn+1]) { for (int i = 0; i < n; i++) printf((i+1)%m ? "%d ":"%d\n", a[i][n]); } int gans(int a[][maxn+1]) { int i, j, ret = a[n-1][n]; for (i = n-2; i >= 0; i--) { for (j = i+1; j < n; j++) a[i][n] ^= a[i][j] && a[j][n]; ret += b[i][n]; } return ret; } void dfs(int p, int k) { if (p == k) { memcpy(b, a, sizeof(b)); int ret = gans(b); if (ret < ans) ans = ret; return; } a[p][n] = 1; dfs(p-1, k); a[p][n] = 0; dfs(p-1, k); }
int getRow(int p, int q, int &row) { for (int i = p; i < n; i++) if (!zero(a[i][q])) return a[row=i][q]; return row = 0; } void swapRow(int i, int row, int q) { for (int k = q; k <= n; k++) swap(a[i][k], a[row][k]); } int gauss() { int i = 0, j = -1, k, p, q, ret, row; while(i < n && ++j < n) { ret = getRow(i, j, row); if (zero(ret)) continue; if (row != i) swapRow(i, row, j); for (p = i + 1; p < n; p++) if (a[p][j]) for (q = j; q <= n; q++) a[p][q] ^= a[i][q]; ++i; }pmat(a); for (k = i; k < n; k++) if (a[k][n]) return -1; dfs(n-1, i-1); } int main() { //freopen("in.in", "r", stdin); int i, j, k, x, y, p, q; char s[5][5]; n = 16; m = 4; for (i = 0; i < m; i++) { scanf("%s", s[i]); for (j = 0; j < m; j++) { a[i*m+j][n] = s[i][j] == 'b'; a[i*m+j][i*m+j] = 1; for (k = 0; k < 4; k++) { x = i + dir[k][0]; y = j + dir[k][1]; if (isBound(x, y)) continue; a[i*m+j][x*m+y] = 1; } } } ans = 1 << 20; p = gauss(); // printf("p = %d\n", p); memset(a, 0, sizeof(a)); for (i = 0; i < m; i++) { for (j = 0; j < m; j++) { a[i*m+j][n] = s[i][j] == 'w'; a[i*m+j][i*m+j] = 1; for (k = 0; k < 4; k++) { x = i + dir[k][0]; y = j + dir[k][1]; if (isBound(x, y)) continue; a[i*m+j][x*m+y] = 1; } } } ans = 1 << 20; q = gauss(); // printf("q = %d\n", q); if (p == -1 && q == -1) puts("Impossible"); else if (p == -1) printf("%d\n", q);ac else if (q == -1) printf("%d\n", p); else printf("%d\n", p <= q ? p:q); return 0; } |