今天lcy老師推薦我看了zjut一位大牛的文章
http://bbs.zjut.com/viewthread.php?tid=1170233&extra=page%3D1
終于略知一二了,找?guī)椎栏怕暑}做做
http://acm.hdu.edu.cn/search.php?field=problem&key=2262
E(now) = (E(NEXT1) + E(NEXT2) +...+E(NEXTn))/n + 1
每個相鄰點(diǎn)建方程,注意起點(diǎn)可以走到得邊才能建方程,不然會導(dǎo)致無解
先floodfill找到起點(diǎn)可以走到得點(diǎn),然后建方程,最后仍個高斯消元模板解把答案解出來
http://acm.zjut.edu.cn/ShowProblem.aspx?ShowID=1423
同上一道一摸一樣的題
http://acm.zjut.edu.cn/ShowProblem.aspx?ShowID=1317
這個需要構(gòu)造,相隔位子數(shù)的轉(zhuǎn)換
想在相鄰n,都向內(nèi)飛的話n-2,都想外飛n+2,一個向左一個向右的話就保持n不變,所以有下列方程
E[n] = E[n+2]/4 + E[n-2]/4 + E[n]/2 + 1
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2619
此題極度郁悶,轉(zhuǎn)移方程已經(jīng)推出來了,卻因?yàn)榫葐栴}過不了
第四個sample我試了三個模板,出來的答案都不一樣。。。。。
用java可過
http://acm.hdu.edu.cn/showproblem.php?pid=3058
上體升級版,變成了多串匹配,建Tire圖的基礎(chǔ)上進(jìn)行轉(zhuǎn)移
一樣存在精度問題,用java可過
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2837
因?yàn)殡娞萦猩嫌邢拢宜餍跃桶褬堑母叨燃颖?nbsp; n = n * 2 - 2
那sample來說,0~10是向上的,10~20是向下的,20就是0,向上的話又變成1開始
在第7和第13層會碰到鬼(我從0層開始,所以每個量都要-1)
這樣就可以得到轉(zhuǎn)移方程
E[i] = E[(i+j)%n]/6 + 1
for(i =0; i < n ; i ++) {
if(i == m || i == n-m) {
mat[i][i] = 1;
} else {
mat[i][i] = 6;
mat[i][n] = 6;
for(j = 1; j <= 6; j ++) {
mat[i][(i+j)%n] --;
}
}
}
http://acm.hdu.edu.cn/showproblem.php?pid=1204
if(i == m || i == n-m) {
mat[i][i] = 1;
} else {
mat[i][i] = 6;
mat[i][n] = 6;
for(j = 1; j <= 6; j ++) {
mat[i][(i+j)%n] --;
}
}
}
這題很早就開始想了,現(xiàn)在才會做,公式如下:
a = p * (1 - q);
b = q * (1 - p);
E[n] = E[n-1] * a + E[n+1] * b + E[n] * (1 - a - b);
E[0] = 0;
E[N+M] = 1;
這兩道AC的代碼都超短,應(yīng)該是公式題。。沒上邊幾道那么有意思。。。
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2949
http://acm.pku.edu.cn/JudgeOnline/problem?id=3682
獻(xiàn)上第一次寫的高斯消元模板
若返回時false則無解
/**************************************************
* mat里建好方程,增廣矩陣 n*(n+1)
* 傳入方程個數(shù)
* 答案保存在mat[i][i]中
**************************************************/
#include "stdio.h"
#include "string"
#define ab(a) (((a)>0)?(a):(-a))
#define maxn 100
#define eps 1e-10
double mat[maxn][maxn];
void swap(double &a,double &b) {double t = a;a = b;b = t;}
bool Gauss(int n) {
int i,j,row,idx;
double maxx,buf;
for(row = 0; row < n ; row ++) {
for(maxx = 0,i =row ; i < n ; i ++)
if(ab(mat[i][row]) > maxx)
maxx = ab(mat[i][row]),idx = i;
if(maxx < eps)return false;
if(idx != row)
for(j =0 ; j <= n ; j ++)
swap(mat[row][j],mat[idx][j]);
for(i = row + 1; i < n ; i ++)
for(buf=mat[i][row]/mat[row][row],j = row; j <= n ; j ++)
mat[i][j] -= buf * mat[row][j];
}
for(i = n-1;i >= 0; i --) {
for(j = i +1; j < n ; j ++)
mat[i][n] -= mat[i][j]*mat[j][j];
mat[i][i] = mat[i][n]/mat[i][i];
}
return true;
}
* mat里建好方程,增廣矩陣 n*(n+1)
* 傳入方程個數(shù)
* 答案保存在mat[i][i]中
**************************************************/
#include "stdio.h"
#include "string"
#define ab(a) (((a)>0)?(a):(-a))
#define maxn 100
#define eps 1e-10
double mat[maxn][maxn];
void swap(double &a,double &b) {double t = a;a = b;b = t;}
bool Gauss(int n) {
int i,j,row,idx;
double maxx,buf;
for(row = 0; row < n ; row ++) {
for(maxx = 0,i =row ; i < n ; i ++)
if(ab(mat[i][row]) > maxx)
maxx = ab(mat[i][row]),idx = i;
if(maxx < eps)return false;
if(idx != row)
for(j =0 ; j <= n ; j ++)
swap(mat[row][j],mat[idx][j]);
for(i = row + 1; i < n ; i ++)
for(buf=mat[i][row]/mat[row][row],j = row; j <= n ; j ++)
mat[i][j] -= buf * mat[row][j];
}
for(i = n-1;i >= 0; i --) {
for(j = i +1; j < n ; j ++)
mat[i][n] -= mat[i][j]*mat[j][j];
mat[i][i] = mat[i][n]/mat[i][i];
}
return true;
}