TYVJ 1106 登山 解题报告
题目中的原话:(**注意**:在任意一层的第一段也可以走到本层的最后一段或上一层的最后一段)。
好恶心的题目,就是一个BFS,一个个搜,但是又类似于DP,不知道怎么形容的好,反正很猥琐。
最后就这样吧,我想说,好好学OI,拿IOI冠军,我要报送。
#include <stdio.h> #include <stdlib.h> #define MAX 100000 #define deal(a, b) deal_(a, b, i, j) int num[1001][1001]; int f[1001][1001]; int used[1001][1001]; int n; struct qu{ int x, y; }queue[MAX]; int head, rear; void exqueue(int *x, int *y) { *x = queue[head].x; *y = queue[head].y; used[*x][*y] = 0; head = (head + 1) % MAX; } void enqueue(int x, int y) { if(used[x][y]){ return; } used[x][y] = 1; queue[rear].x = x; queue[rear].y = y; rear = (rear + 1) % MAX; } void deal_(int a, int b, int i, int j) { if(b == 0){ b = a; } if(b == a + 1){ b = 1; } if(f[a][b] > f[i][j] + num[a][b]){ f[a][b] = f[i][j] + num[a][b]; enqueue(a, b); } } int check(int a, int b) { if(a > n || a < 1 || b > a || b < 1){ return 0; } return 1; } int min(int a, int b) { return a < b ? a : b; } int main(int argc, char **argv) { int i, j; scanf("%d", &n); for(i = 1; i <= n; i++){ for(j = 1; j <= i; j++){ f[i][j] = 0xFFFFFFF; scanf("%d", &num[i][j]); } } f[n][1] = num[n][1]; enqueue(n, 1); while(head != rear){ exqueue(&i, &j); deal(i, j - 1); deal(i, j + 1); deal(i - 1, j); deal(i - 1, j - 1); } printf("%d\n", f[1][1]); return 0; }