度小满笔试 机器学习第2题求助



#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
#include <unordered_set>
using namespace std;
int getRes(vector<int> v, int a, int b, int c) {
	int n = v.size();
	vector<vector<int> > dp(n, vector<int>(n, n));
	for (int i = 0; i < n; i++) {
		dp[i][i] = 0;
	}
	for (int i = n - 1; i >= 0;i--) {
		for (int j = 0; j < n; j++) {
			if (v[i] > 1) dp[i][j] = min(dp[i][j], dp[i][v[i] - 1] + dp[v[i] - 1][j] + b);
			else if (v[i] < n) dp[i][j] = min(dp[i][j], dp[i][v[i] + 1] + dp[v[i] + 1][j] + c);
			else dp[i][j] = min(dp[i][v[i]] + dp[v[i]][j] + a, dp[i][j]);
		}
	}
	return dp[0][n - 1];
}
int main() {
	vector<int> v = { 3,6,4,3,4,5,6 };
	int res = getRes(v, 1, 1, 1);
	cout << res << endl;
	return 0;
}

用动规的思想来做,不过状态转移方程式和初始化顺序有些问题,0AC,还请大佬帮忙解答。dp[i][j]代表从城市i到城市j的最小花费。#度小满##笔试题目#
全部评论
解释下思路? 我是用的是计算花1块能到哪些城市,花2块。。。。这样
点赞 回复 分享
发布于 2019-09-15 20:57
可以提供一下第一题 障碍题 和第三题 博弈论的代码吗?
点赞 回复 分享
发布于 2019-09-15 21:25
我当时是这个思路,不过优化方法跟你不太一样,代码没保存,只能简单说说思路,通过了90%,不知道为啥没AC,思路是,构建一个N+1的数组,代表着从当前城市到N城市的距离 输入数组 nums动态规划数组 dp 初始化 dp[i] = A + C * (N - nums[i]) 迭代对于每个 城市 i最优的左边界lmax和右边界rmax对于 lmax 到 i 的城市j然后更新dp[i] = min(dp[i], dp[j] + (i - j) * C + A)同理,i到rmax 也是 终止条件:dp[1] 没有变化
点赞 回复 分享
发布于 2019-09-15 21:32

相关推荐

10-11 18:07
已编辑
华中科技大学 Java
点赞 评论 收藏
分享
点赞 8 评论
分享
牛客网
牛客企业服务