這道題明顯就是乙個大暴力,但是考場上碰到這種題確實讓人傷腦筋,
如何在考場上穩穩地拿下這100分呢?
首先,為了進行完全的搜尋,這題應用dfs的結構,
而不是貪心選擇某種出牌方式。然後我們應先分析搜尋的方法。
在dfs中我們先考慮不帶牌的出法。即單順子,雙順子,三順子。
三帶一、三帶二可以看做是特殊的三張牌;
四帶二可以看做是特殊的炸彈。
通過歸納,剩下的出牌方法就只有單排,對子和王炸了。
所以在dfs的單層中,程式需要做:
搜尋單順子,雙順子,三順子
搜尋三張牌,炸彈
搜尋剩下的單排,對子,王炸
這樣寫的話可能只能通過60%~80%的資料。考慮優化
三張牌和炸彈帶的牌可以最後在剩下的單排,對子中去除。
而不用在搜尋三張牌,炸彈時進行搜尋。
#include #include #include #include #include #define ll long long
#define inf 2147483647
using namespace std;
struct sth
}p,debug;
int t,n,i,j,x,y,ans;
int w,bs,sm;
bool cl(sth s)
void make(sth s,int step)}}
for (k=3;k<=12;k++)}}
for (k=3;k<=13;k++)}}
for (k=3;k<=15;k++)
}for (k=3;k<=15;k++)
}int dan=0,dui=0;
for (k=3;k<=15;k++)
switch(f.l[k])
if (f.w) dan+=f.w;
while (f.zd>0 && (dan>1||dui>0))
dan+=dui;
while (f.ld>0&&dan>0)
if (dan>=f.w) dan-=f.w; else f.w=0;
for (k=3;k<=15;k++)
f.l[k]=0;
make(f,step+dan);
}void init()
int main()
p.w=w;
ans=n;
make(p,0);
printf("%d\n",ans);
}return 0;
}
字首和 pre[i]=pre[i-1]+a[i]二維字首和
pre[i][j]=pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1]+a[i][j]
pre[x2][y2]-pre[x1-1][y2]-pre[x2][y1-1]+pre[x1-1][y1-1]
x1,y1
x2,y2
第i個動作的第j位向後的最近乙個數字k的位置
if k == a[i][j][k+1]:
suf[i][j][k]=k+1
else:
suf[i][j][k]=suf[i][j][k+1]
NOIP Dp基本套路大全
dp,一直是困擾許 我 許 這 多 一 多 個 oler 蒟蒻 的問題之一。而在看似毫無章法與固定解題模式的dp題中,卻實實在在有那麼一些基本套路,幫助我們在求解dp的過程中能給我們或多或少提 多 供 騙 一些思 水 路 分 持續更新中。求大佬指正orz。p.s 以下的狀態轉移方程只是最基礎的,不含...
Redis使用基本套路
redis的資料,通常都是來自於資料庫。存入redis當中,可以快速的查詢。不用每次都關聯查詢,然後其他處理什麼的。通常可以把一些,不經常變的資料儲存其中。避免資料變動,而redis快取資料不變,可以為快取資料設定乙個過期時間。通常redis儲存的資料都是陣列進行json加密,而取出的時候,進行js...
luogu 十一 基本套路 day1
對於乙個線段,要不就只買票,要不就用ic卡 貪心嘛 所以只要比較這兩種策略,取較大值就好。rep i,1,n 1 rd n rd m while m rep i,1,n rep j,1,n 構造相鄰的兩頭牛,看能不能貪心,且看需要滿足什麼條件的時候才能貪心。設有相鄰的兩頭牛a,b,來討論一下在滿足什...