Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

哈哈,记得处理起点,忘了中间啦,haha~~~ 附AC代码

Posted by yousiki at 2016-07-30 10:43:58 on Problem 2111 and last updated at 2016-07-30 10:48:40
嗯,先Sort排序所有点的高度,从大到小,然后强制从前面的点来转移。
为了解决字典序最小的问题,需要注意两个地方:
1.Ans存最后的起点,那么我们从前往后扫描时,只要有>=当前解的解,就应当更新答案。这样就保证了最优解的前提下,起点最小。
2.中间的DP值在转移时,也要注意一下当新的解==当前解的情况。由于我是按照移动列表(move[]数组)转移,所以只能根据其指向的块的高度判断一下是否是更小的字典序。

然后,感受一下39行的代码吧!

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 366;
const int INF = 0x3f3f3f3f;
const int mv[8][2] = { {1,2},{-1,2},{1,-2},{-1,-2},{2,1},{-2,1},{2,-1},{-2,-1} };
struct King {
	pair<int, int> pos, pre;
	int height, dynamic;
	friend bool operator < (King a, King b) {
		return a.height > b.height;
	}
}K[N*N];
int n, map[N][N], tot = 0;
pair<int, int> ans;
signed main(void) {
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			scanf("%d", &K[++tot].height),
			K[tot].dynamic = 1,
			K[tot].pos = make_pair(i, j);
	sort(K + 1, K + 1 + tot);
	for (int i = 1; i <= tot; i++)
		map[K[i].pos.first][K[i].pos.second] = i;
	for (int i = 1; i <= tot; i++) {
		for (int j = 0; j < 8; j++)
			if (K[i].pos.first + mv[j][0] > 0 && K[i].pos.first + mv[j][0] <= n && K[i].pos.second + mv[j][1] > 0 && K[i].pos.second + mv[j][1] <= n)
				if (map[K[i].pos.first + mv[j][0]][K[i].pos.second + mv[j][1]]<i && (K[map[K[i].pos.first + mv[j][0]][K[i].pos.second + mv[j][1]]].dynamic + 1>K[i].dynamic|| K[map[K[i].pos.first + mv[j][0]][K[i].pos.second + mv[j][1]]].dynamic + 1==K[i].dynamic&&map[K[i].pos.first + mv[j][0]][K[i].pos.second + mv[j][1]]>map[K[i].pre.first][K[i].pre.second]))
					K[i].dynamic = K[map[K[i].pos.first + mv[j][0]][K[i].pos.second + mv[j][1]]].dynamic + 1, K[i].pre.first = K[i].pos.first + mv[j][0], K[i].pre.second = K[i].pos.second + mv[j][1];
		if (K[i].dynamic >= K[map[ans.first][ans.second]].dynamic)ans = K[i].pos;
	}
	printf("%d\n", K[map[ans.first][ans.second]].dynamic);
	while (ans.first&&ans.second)printf("%d\n", K[map[ans.first][ans.second]].height), ans = K[map[ans.first][ans.second]].pre;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator