第一行為三個整數n,m,k,分別表示地圖的長和寬,以及最多能放置的炮塔數量。
接下來的n行,每行包含m個字元,『#』表示地圖上原有的障礙,『.』表示該處為空地,
資料保證在原地圖上存在s到t的路徑。
輸出在合理布陣下,喵星人採取最優策略後,會受到的最大傷害。
注意必須保證在布陣結束後喵星人仍然可以沿一條或以上的路徑從起點s到達終點t,
否則他們組織更大規模的侵略。
【資料範圍】
對於30%的資料,保證:
1<=n,m<=6
對於100%的資料,保證:
1<=n<=6,1<=m<=20,1<=k<=15,且從s到t的路徑必定存在。
1 #include2view code#define il inline
3#define rg register
4using
namespace
std;
5const
int n=10,m=21,sz=1e5;
6int
n,m,k,c1[n],c2[n],cur,ans;
7char
s[m][m];
8struct
hash
11 il void upd(int x,int
y)16 nt[++o]=hd[x%sz],hd[x%sz]=o,v[o]=x,w[o]=y;17}
18 }f[2
][m];
19 il void upd(int&x,int y)
20 il void decode(int
x)24 il int
encode()
30 il int le(int
x)return0;
35}36 il int ri(int
x)return0;
41}42 il int cal1(int
x)47 il int cal2(int
x)52 il bool check(int
j)56
intmain()
68swap(n,m);69}
70 f[cur=0][0].upd(0,0
);71
for(rg int i=0;ii)
72for(rg int j=0;jj)
82/*
83*/
9293
int &p=c1[j],&q=c1[j+1],&r=c2[j],w1=w+cal1(j),w2=w+cal2(j);
94int t1=j&&(c2[j-1]&1),t2=j!=m&&(c2[j+1]&1
);95
if(s[i][j]=='#'
)else
if(!p&&!q)
104if(t1||t2)continue
;105
if(s[i][j]=='
s'||s[i][j]=='t'
)else p=1,q=2,r=1,f[cur^1
][k].upd(encode(),w2);
109 }else
if(!p||!q)
116else
if(check(j))p=0,q=0,r=1,f[cur^1
][k].upd(encode(),w2);
117 }else
121 }else
else
if(p==3||q==3
)else
134 p=q=0,r=1,f[cur^1
][k].upd(encode(),w2);
135}
136}
137}
138f[cur][k].init();
139}
140 cur^=1
;
141}
142for(int i=1;i<=k;++i)
143for(int j=1;j<=f[cur][i].o;++j)
147 printf("
%d\n
",ans);
148return0;
149 }
BZOJ 1079 SCOI2008 著色方案
題目 分析 一看就覺得是dp或者直接排列組合公式或者容斥?我就只想到dp的,我們用dp i j 表示前i種顏色,排列出有j對相鄰一樣顏色的方案數。當出現乙個新的顏色時,我們把這個顏色插板法插進去,我們要列舉插入的方式,可能插到相鄰顏色一樣的中間,或者不是,然後進行狀態轉移.具體看 include i...
BZOJ1066 SCOI2007蜥蜴 最大流
挺顯然的最大流,源向所有有蜥蜴的點連inf邊,所有點拆成入點和出點,入店向出點連流量為高度的邊,限制流量,所有可以一步跳出去的點向匯連inf邊,跑最大流就行了。include include include define inf 99999999 define maxn 1005 using nam...
BZOJ1079 SCOI2008著色方案 DP
只能想到 5 15 的方法。我們要利用起 ci比較小這個性質,f a b c d e last 表示有a 種顏色用了1個,b種顏色用了2個 上一次染色用的是剩餘 last 個的顏色,轉移就是f a,b,c,d,e,last a last 2 f a 1,b,c,d,e b last 3 f a 1,...