- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
有N个城市。每个城市都有1到10(含)类型的传送点。给你一个大小为 N 的数组,用整数表示每个城市的传送类型。对于前。 1 3 5 3 8 9
。目标是根据以下规则找到从数组中的第一个条目到最后一个条目所需的最少小时数:
3
。此操作花费给定的 R 小时数。我已经实现了一个动态编程解决方案,当最快的方法只是向前移动时,它可以完美地工作。但在某些情况下,返回几个城市然后向前传送会更快,从而最大限度地减少花费的时间。
这是我的算法失败的例子:例如。 2 1 3 4 6 8 5 7 4 2 3 5 2 1 3 4 3 5 6 7
和 R = 2
正确答案:索引 0(时间 = 0)-> 索引 9(时间 = 2)-> 索引 8(时间 = 3)-> 索引 7(时间 = 4)-> 索引 19(时间 = 6)。我的算法会找到仅向前移动的最快方法,显然,正确的最快方法还涉及向后移动。
到目前为止,这是我的代码:
#include <iostream>
using namespace std;
int main()
{
int dp[200] = {};
short ti[200] = {};
int numCities, R;
cin >> numCities >> R;
for (int i = 0; i < numCities; i++)
{
short temp;
cin >> temp;
ti[i] = temp;
}
for (int i = 1; i < numCities; i++)
{
dp[i] = dp[i - 1] + 1;
for (int x = i - 1; x >= 0; x--)
{
if (ti[x] == ti[i])
{
if (R + dp[x] < dp[i])
dp[i] = R + dp[x];
}
}
}
cout << dp[numCities - 1];
return 0;
}
我如何让我的算法适用于这种情况,其中较低的状态取决于较大的状态?
编辑:我按以下方式使用动态规划:对于每个城市,我计算在给定起始状态 dp[0] = 0
的情况下到达它们的最快方式。则递归关系为:dp[i] = min(dp[i - 1] + 1, dp[每隔一个具有相同传送类型的点] + R)
最佳答案
动态规划适用于问题具有最优子结构的情况。也就是说,您必须找到一种方法来分割问题,以便分割的最佳解决方案可以用作构建 block 来找到整个问题的最佳解决方案。
上面,我看你说要用动态规划。我看到了代码。我没有看到对您正在考虑的子问题的明确解释。也就是说:对解决方案的概念性理解是正确进行动态编程的关键,而这正是您没有提供的。
我的直觉是,在这种情况下动态规划不是一个好的方法,因为:
您可以使用嵌套循环来解决这些问题。这为您提供了 O(n^2) 时间解决方案。
但是,将此问题视为加权图遍历的一个实例,您可以使用 Dijkstra's algorithm 来解决它。在 O(n log n + m) 时间内(O(n) 遍历足以建立每个节点的邻居),其中 m 是考虑的边缘数量(这里可以通过识别每个传送器类型将仅使用一次来将其限制为 Θ(m) 的值)。为什么不这样做呢?
您可以尝试使用 A* 来改善运行时间,尽管我不相信这会在一个维度上提供很大的改进。
完成此操作的代码可能如下所示:
#include <iostream>
#include <queue>
#include <unordered_set>
#include <unordered_map>
typedef std::unordered_map<int, std::vector<int> > tele_network_t;
int Dijkstra(const std::vector<int> &graph, const tele_network_t &tn, const int R){
//This whole mess makes the smallest elements pop off the priority queue first
std::priority_queue<
std::pair<int, int>,
std::vector< std::pair<int, int> >,
std::greater< std::pair<int, int> >
> pq; //<distance, index>
//Keeping track of the teleporters used allows us to speed up the algorithm by
//making use of the theorem that each teleporter type will be used only once.
std::unordered_set<int> teleporters_used;
//Keep track of the path
std::vector<int> parent(graph.size(),-1); //Parent==-1 indicates an unvisited node
//At 0 distance, place the 0th node
pq.emplace(0,0);
parent[0] = 0; //The only node whose parent is itself should be node 0
while(!pq.empty()){
const auto c = pq.top();
pq.pop();
//We've reached the goal node
if(c.second==graph.size()-1){
std::cout<<"Dist = "<<c.first<<std::endl;
break;
}
//Insert neighbours
if(c.second!=0 && parent[c.second-1]==-1){ //Left neighbour
parent[c.second-1] = c.second;
pq.emplace(c.first+1,c.second-1);
}
if(parent[c.second+1]==-1){ //Right neighbour: can't overflow because goal is the rightmost node
parent[c.second+1] = c.second;
pq.emplace(c.first+1,c.second+1);
}
//Inner loop is executed once per teleporter type
if(teleporters_used.count(graph[c.second])==0)
for(const auto i: tn.at(graph[c.second])){
if(parent[i]==-1){
pq.emplace(c.first+R,i);
parent[i] = c.second;
}
}
teleporters_used.insert(graph[c.second]);
}
//Trace our steps backwards to recover the path. Path will be reversed, but a
//stack could be used to fit this.
int p = graph.size()-1;
while(parent[p]!=p){
std::cout<<p<<std::endl;
p = parent[p];
}
std::cout<<0<<std::endl;
}
int main(){
tele_network_t tele_network;
const int R = 2;
std::vector<int> graph = {{2,1,3,4,6,8,5,7,4,2,3,5,2,1,3,4,3,5,6,7}};
//Determine network of teleporters
for(int i=0;i<graph.size();i++)
tele_network[graph[i]].push_back(i);
Dijkstra(graph, tele_network, 2);
}
关于algorithm - 动态规划依赖于更大的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42655404/
我正在通读 Windows Phone 7.5 Unleashed,有很多代码看起来像这样(在页面的代码隐藏中): bool loaded; protected override void OnNav
在cgi服务器中,我这样返回 print ('Status: 201 Created') print ('Content-Type: text/html') print ('Location: htt
我正在查看 esh(easy shell)的实现,无法理解在这种情况下什么是 22 和 9 信号。理想情况下,有一个更具描述性的常量,但我找不到列表。 最佳答案 信号列表及其编号(包括您看到的这两个)
我的Oozie Hive Action 永远处于运行模式。 oozie.log文件中没有显示错误。
我正在编写一个使用 RFCOMM 通过蓝牙连接到设备的 Android 应用程序。我使用 BluetoothChat 示例作为建立连接的基础,大部分时间一切正常。 但是,有时由于出现套接字已打开的消息
我有一个云调度程序作业,它应该每小时访问我的 API 以更新一些价格。这些作业大约需要 80 秒才能运行。 这是它的作用: POST https://www.example.com/api/jobs/
我正在 Tomcat 上访问一个简单的 JSP 页面: 但是当我使用 curl 测试此页面时,我得到了 200 响应代码而不是预期的 202: $ curl -i "http://localhos
有时 JAR-RS 客户端会发送错误的语法请求正文。服务器应响应 HTTP status 400 (Bad Request) , 但它以 HTTP status 500 (Internal Serve
我正在尝试通过 response.send() 发送一个整数,但我不断收到此错误 express deprecated res.send(status): Use res.sendStatus(sta
我已经用 Excel 和 Java 做过很多次了……这次我需要用 Stata 来做,因为保存变量更方便'labels .如何将 dataset_1 重组为下面的 dataset_2? 我需要转换以下
我正在创建一个应用程序,其中的对象具有状态查找功能。为了提供一些上下文,让我们使用以下示例。 帮助台应用程序,其中创建作业并通过以下工作流程移动: 新 - 工作已创建但未分配 进行中 - 分配给工作人
我想在 Keras 中运行 LSTM 并获得输出和状态。在 TF 中有这样的事情 with tf.variable_scope("RNN"): for time_step in range
有谁知道 Scala-GWT 的当前状态 项目? 那里的主要作者 Grzegorz Kossakowski 似乎退出了这个项目,在 Spring 中从事 scalac 的工作。 但是,在 interv
我正在尝试编写一个 super 简单的 applescript 来启动 OneDrive App , 或确保打开,当机器的电源设置为插入时,将退出,或确保关闭,当电源设置为电池时。 我无法找到如何访问
目前我正在做这样的事情 link.on('click', function () { if (link.attr('href') !== $route.current.originalPath
是否可以仅通过查看用户代理来检测浏览器上是否启用/禁用 Javascript。 如果是,我应该寻找什么。如果否,检测用户浏览器是否启用/禁用 JavaScript 的最佳方法是什么 最佳答案 不,没有
Spring 和 OSGi 目前的开发状况如何? 最近好像有点安静了。 文档的最新版本 ( http://docs.spring.io/osgi/ ) 来自 2009 年。 我看到一些声明 Sprin
我正在从主函数为此类创建一个线程,但即使使用 Thread.currentThread().interrupt() 中断它,输出仍然包含“Still Here”行。 public class Writ
为了满足并发要求,我想知道如何在 Godog 中的多个步骤之间传递参数或状态。 func FeatureContext(s *godog.Suite) { // This step is ca
我有一个UIButton子类,它不使用UIImage背景,仅使用背景色。我注意到的一件事是,当您设置按钮的背景图像时,有一个默认的突出显示状态,当按下按钮时,该按钮会稍微变暗。 这是我当前的代码。
我是一名优秀的程序员,十分优秀!