ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Pokemon Go Go (状压dp)

2020-10-01 09:33:49  阅读:219  来源: 互联网

标签:point int 状压 宝可梦 ++ mp Go Pokemon dp


//捕捉宝可梦
//考虑状压dp,一维是宝可梦的捕捉状态,二维保存当前捕捉的宝可梦编号
const int inf = 0x3f3f3f3f;
int n, cnt;
int dp[1 << 20][22];//dp[sta][point]
unordered_map<string, int> mp;
struct point {
	int x, y;
	int type;
};
point a[25];
string s;

int get_cal(point i, point j) {
	return abs(i.x - j.x) + abs(i.y - j.y);
}

int main() {
	ios::sync_with_stdio(0);

	while (cin >> n) {
		for (int i = 0; i < n; ++i) {
			cin >> a[i].x >> a[i].y;
			cin >> s;
			if (!mp.count(s))	mp[s] = cnt++;
			a[i].type = mp[s];
		}

		memset(dp, inf, sizeof dp);

		for (int i = 0; i < n; ++i) {//初始化:原点到每种宝可梦的最短距离
			dp[(1 << a[i].type)][i] = min(dp[(1 << a[i].type)][i], get_cal(a[n + 3], a[i]));//a[n+3]可看作原点
		}

		int limit = (1 << cnt);
		for (int i = 0; i < limit; ++i) {//枚举状态
			if ((i == (i & -i)))	continue;//已经初始化,跳过
			for (int j = 0; j < n; ++j) {//当前选择的点
				if (!(i & (1 << a[j].type)))	continue;
				int last = i - (1 << a[j].type);//前一次的状态
				for (int k = 0; k < n; ++k) {//前一次选择的点
					if (last & (1 << a[k].type))	dp[i][j] = min(dp[i][j], dp[last][k] + get_cal(a[k], a[j]));
				}
			}
		}

		int ans = inf;
		for (int i = 0; i < n; ++i)
			ans = min(ans, dp[limit - 1][i] + get_cal(a[n + 3], a[i]));//a[n+3]未初始化,为(0,0)
		cout << ans << endl;
	}
	return 0;
}

标签:point,int,状压,宝可梦,++,mp,Go,Pokemon,dp
来源: https://www.cnblogs.com/wanshe-li/p/13757296.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有