description
ryz被困在了乙個n*m四連通網格圖的迷宮中,每走一步需要消耗一定的體力,消耗的體力等於格仔的高度差的平方。在迷宮的某一些格仔上有體力藥水,可以恢復ryz一定的體力。現在ryz希望消耗最少的體力值到達迷宮出口,請你計算出這個最小的體力值。
你可以認為ryz一開始有足夠多的體力。
input
第一行7個正整數n,m,k,sx,sy,tx,ty分別表示迷宮的長度,寬度,體力藥水的數量,起點座標和終點座標。
接下來是乙個n行m列的矩陣,描述每乙個格仔的高度。
接下來k行,每行3個整數x,y,s,表示在第x行第y列的這個格仔中有一瓶能夠恢復s體力的藥水。
output
僅乙個整數,表示最小消耗的體力值,有可能是負數。
sample input
3 3 1 1 1 1 3
1 2 3
4 3 0
5 6 5
3 3 13
sample output
-1data constraint
對於20%的資料,k=0。
對於60%的資料,n<=20,m<=20,k<=10
對於100%的資料,n*m<=1000,k<=15,s<=10^5,0<=h<10
思路顯然,在走的過程中,要麼走向下乙個藥水所在點,要麼走向終點,角色肯定不會亂逛。所以把起終點也算作是一種恢復體力值為0的藥水,然後預處理出藥水之間的距離,狀壓dp即可。
**
#include #include #include #include #define sqr(x) (x*x)
using namespace std;
struct edge ;
int dx[4]=,dy[4]=;
long long n,m,k,sx,sy,tx,ty,x[20],y[20],c[20],h[110][110],g[20][20],f[20][110][110],dp[20][(1<<16)+10],ans;
bool pd(int x,int y)
void bfs()
); f[i][x[i]][y[i]]=0;
while (!q.empty()));}
}} for (int j=0;j<=k+1;j++) if(i!=j) g[i][j]=f[i][x[j]][y[j]]; }}
int main()
printf("%lld",ans);
}
JZOJ B組 幸運數
description 如果乙個正整數的所有質因子都小於等於m且每種質因子個數都為奇數,則稱這個數為幸運數,例如當m 3時,6是幸運數而5不是,12也不是幸運數 2這個質因子有偶數個 給定n,m,求小於等於n的幸運數有多少個。input 一行2個數,表示n,m。output 一行1個數,表示幸運數的...
dfs bfs 逃離迷宮
給定乙個m n m行,n列 的迷宮,迷宮中有兩個位置,gloria想從迷宮的乙個位置走到另外乙個位置,當然迷宮中有些地方是空地,gloria可以穿越,有些地方是障礙,她必須繞行,從迷宮的乙個位置,只能走到與它相鄰的4個位置中,當然在行走過程中,gloria不能走到迷宮外面去。令人頭痛的是,glori...
A 逃離迷宮 DFS
給定乙個m n m行,n列 的迷宮,迷宮中有兩個位置,gloria想從迷宮的乙個位置走到另外乙個位置,當然迷宮中有些地方是空地,gloria可以穿越,有些地方是障礙,她必須繞行,從迷宮的乙個位置,只能走到與它相鄰的4個位置中,當然在行走過程中,gloria不能走到迷宮外面去。令人頭痛的是,glori...