分析:之前的一道模擬賽題是dp+dfs,這道題是dp+bfs.
我們設f[stu][i][j]為當前狀態為stu,走到(i,j)的答案,考慮怎麼設計stu,每個人的狀態有3種:要麼在原地,要麼被揹著,要麼已經到了終點,那麼用乙個3進製數儲存就可以了.
下面考慮怎麼轉移,直接遞推肯定是不對的,dfs也不行,只能bfs了.我們每次可以選擇不走,或者如果當前點有人就背起來,或者到了終點就放下所有人或者放下所有使速度變慢的人,寫好幾次轉移就過了.
#include #include#include
#include
#include
using
namespace
std;
const
int inf = 0x7ffffff
;int n, m, k, top, sx, sy, tx, ty, a[20][20], speed[30], f[60010][15][15], dx = , dy = ,flag[20
];char name[30][3],s[20][20
];struct
node
;int jisuan(int
stu)
for (int i = 1; i <= top; i++)
if (flag[i] == 1
) sped +=speed[i];
if (sped < 1
) sped = 1
;
return
sped;
}bool judge(int x, int
y)int bei(int stu, int x, int
y) memset(flag,
0, sizeof
(flag));
while
(stu)
if(flag[cur])
return0;
flag[cur] = 1
;
for (int i = top; i >= 1; i--)
stu = stu * 3 +flag[i];
return
stu;
}int fang1(int stu, int x, int
y)
for (int i = 1; i <= top; i++)
if (flag[i] == 1
) flag[i] = 2
;
for (int i = top; i >= 1; i--)
stu = stu * 3 +flag[i];
return
stu;
}int fang2(int stu, int x, int
y)
for (int i = 1; i <= top; i++)
if (flag[i] == 1 && speed[i] > 0
) flag[i] = 2
;
for (int i = top; i >= 1; i--)
stu = stu * 3 +flag[i];
return
stu;
}int qpow(int a, int
b)
return
res;
}void
bfs()
//揹人
if (s[nx][ny] >= '
a' && s[nx][ny] <= 'z'
)
}//放人
if (s[nx][ny] == 't'
)
if (f[stu2][nx][ny] > f[u.zhuangtai][x][y] +sudu)}}
}}}int
main()
else
else}}
}for (int i = 1; i <= top; i++)
scanf(
"%s%d
", name[i], &speed[i]);
for (int i = 0; i <= 60000; i++)
for (int j = 1; j <= 10; j++)
for (int l = 1; l <= 10; l++)
f[i][j][l] =inf;
f[0][sx][sy] = 0
; bfs();
printf(
"%d\n
", f[qpow(3, top) - 1
][tx][ty]);
return0;
}
蒜頭君救人
問題 蒜頭君是乙個樂於助人的好孩子,這天他所在的鄉村發生了洪水,有多名村民被困於孤島上,於是蒜頭君決定去揹他們離開困境,假設蒜頭君所在的村子是 n mn m 的網格,網格中.號代表平地,號代表該地已被洪水淹沒,a b 等大寫字母表示該地有村民被困,s代表蒜頭君的起點,t代表蒜頭君的終點。蒜頭君的初始...
noip模擬賽 蒜頭君的兔子
分析 直接暴力算有30分,像斐波那契那樣推式子算有60分,如果想要得到100分就要用一種數列題的常見優化 矩陣了.當前的兔子數和十年內的兔子數有關,我們需要1個1 11的矩陣,來記錄當前為0歲 1歲 2歲.兔子的數量,同時還需要乙個快速冪矩陣進行計算.由於一年後a 1 a 0 a 2 a 1 a 1...
noip模擬賽 蒜頭君的樹
分析 這道題問的是樹上整體的答案,當然要從整體上去考慮.一條邊對答案的貢獻是這條邊一端連線的點的個數 另一端連線的點的個數 邊權,可以用一次dfs來統計答案,之後每次更改操作在原答案的基礎上增減就好了.千萬不要傻傻地去求lca.事實證明只有10分.問的是任意兩點最短距離之和,樹上兩個點的最短路徑只有...