国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

【BZOJ 1019】 [SHOI2008]漢諾塔

2019-11-06 06:29:30
字體:
供稿:網(wǎng)友

【題目鏈接】:http://www.lydsy.com/JudgeOnline/PRoblem.php?id=1019

【題意】

【題解】 這個(gè)題解講得很清楚了 http://blog.sina.com.cn/s/blog_76f6777d0101b8l1.html 大概就是設(shè) f[i][j],g[i][j]分別表示第i個(gè)塔上有j個(gè)盤,然后這j個(gè)盤全部轉(zhuǎn)移到g[i][j]上的方案數(shù); f[1..3][1]和g[1..3][1]都能根據(jù)一開始那個(gè)東西確定. 第i個(gè)塔有n個(gè)盤 則n-1個(gè)移到一個(gè)上 然后剩一個(gè)大的放在另外一個(gè)上面; 然后再把它們合在一起就能整體移出去了 (對一個(gè)盤只能操作一次,不,應(yīng)該說不能對一個(gè)盤連續(xù)操作,n-1個(gè)盤看成整體一個(gè)盤); 根據(jù)漢諾塔的移動規(guī)則寫遞推. 最后輸出f[1][n] 我把分析摘錄下來。 都是上面那個(gè)博客的.

/*f[x][i],g[x][i] 可由 f[][i-1],g[][i-1] 推得:漢諾塔的經(jīng)典轉(zhuǎn)移,先做子問題把x柱上的i-1個(gè)圓盤移走,再把第i個(gè)大圓盤移走..若設(shè)y=g[x][i-1],z=1+2+3-y-x(即除x,y以外的柱子編號)即1) x上i-1個(gè)圓盤移至y上 2)由于不能對一個(gè)圓盤進(jìn)行重復(fù)操作,所以必是將x上的第i個(gè)圓盤,移至z 由于i個(gè)圓盤還沒疊到一起,所以接下來顯然還要再次移動y上的i-1個(gè),這時(shí)需要分類討論: 若 f[y][i-1]=z: 3)移到z后,便結(jié)束了 綜合以上,這種情況下,f[x][i]=f[x][i-1]+1+f[y][i-1],g[x][i]=z 若f[y][i-1]=x: 3)i-1個(gè)圓盤移至x 4)不能對一個(gè)圓盤進(jìn)行重復(fù)操作,所以必將z上的第i個(gè)圓盤,移至y 5)因g[x][i-1]=y,所以x上i-1個(gè)圓盤移至y,結(jié)束 綜合以上,這種情況下,f[x][i]=f[x][i-1]+1+f[y][i-1]+1+f[x][i-1],g[x][i]=y */

ps:這題還能構(gòu)造線性關(guān)系搞 即 f[n] = k*f[n-1]+b; 求出k和b就能搞; 當(dāng)然要從n>=3開始. 【完整代碼】

#include <bits/stdc++.h>using namespace std;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define LL long long#define rep1(i,a,b) for (int i = a;i <= b;i++)#define rep2(i,a,b) for (int i = a;i >= b;i--)#define mp make_pair#define pb push_back#define fi first#define se second#define rei(x) scanf("%d",&x)#define rel(x) scanf("%lld",&x)typedef pair<int, int> pii;typedef pair<LL, LL> pll;const int dx[9] = { 0,1,-1,0,0,-1,-1,1,1 };const int dy[9] = { 0,0,0,-1,1,-1,1,-1,1 };const double pi = acos(-1.0);const int N = 40;int n;char s[8][5];LL f[4][N];int g[4][N];int main(){ //freopen("F://rush.txt", "r", stdin); rei(n); rep1(i, 1, 6) scanf("%s", s[i]); rep1(i, 1, 3) { rep1(j, 1, 6) { if (s[j][0] - 'A' + 1 == i) { g[i][1] = s[j][1] - 'A' + 1; f[i][1] = 1; break; } } } rep1(i, 2, n) { rep1(x, 1, 3) { int y = g[x][i - 1]; int z = 1 + 2 + 3 - x - y; if (g[y][i - 1] == z) { f[x][i] = f[x][i - 1] + 1 + f[y][i - 1]; g[x][i] = z; } else { f[x][i] = f[x][i - 1] + 1 + f[y][i - 1] + 1 + f[x][i - 1]; g[x][i] = y; } } } printf("%lld/n", f[1][n]); return 0;}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 高青县| 高安市| 仲巴县| 库伦旗| 湖口县| 武强县| 定兴县| 临猗县| 瑞昌市| 启东市| 鄄城县| 富宁县| 江口县| 天津市| 鸡西市| 河北区| 乐都县| 黄陵县| 福州市| 嘉兴市| 桐乡市| 宁陕县| 高唐县| 科尔| 五常市| 惠水县| 平罗县| 沙雅县| 黄大仙区| 彭泽县| 株洲市| 灵川县| 镇康县| 阳新县| 焦作市| 云林县| 沈阳市| 宣恩县| 昭通市| 农安县| 来安县|