看起来像什么样子 FlowerGarden pr0blem 在 TopCoder a DP-one?
我在基于的问题上阅读了这本优秀的Dumutra教科书 DP
http://www.topcoder.com/tc%3Fd ... tatic
. 而且我正试图提出一种基于的方法 DP, 对于一个问题
http://community.topcoder.com/ ... D5006
, 在问题列表中提到 1D DP.
我只能考虑与之相关的决定 DP, 这将包括按顺序排序颜色的初始排序,然后根据任务中提到的条件的各种检查重新排序。 它没有被归类为 DP, 是不是?
编辑文章也没有说 DP.
任何人都可以不小心向我施加对此问题的正确解决方案 DP?
谢!
编辑:
我不知道链接需要注册。 这是问题所在的地方:
分期任务
你用灯泡种植花园,全年给你快乐的花朵。 但是,你想植花
这样他们就不会阻挡其他花朵。
你会得到 int[] 生长, int[] 开花I. int[] 枯萎。
每种类型的花由具有相同索引的元素表示。
高度,开花和褪色。 高度代表高度
每种花类型,盛开代表每种花型时的早晨
它流出了地面,苗条代表每种类型的花都从地面流出时。
花皱纹和模具的类型。 开花和褪色中的每个元素
将有一个数字 1 到 365 包容性,我 wilt[i] 总是
会有更多 bloom[i]. 你必须种植这个世界的所有颜色。
出现一行中的相同类型,您也想要拥有
最高的花朵如下。 但是,如果一个
花的类型高于另一个,两种类型都可以是
陆地同时,必须以较短的花卉种植
较高的花以防止阻塞。 花朵绽放
早上和晚上褪色,所以即使一朵花绽放
在同一天,逐渐消失,一个人可以阻挡另一个花。
你必须返回 int[], 其中包含高度的元素
您必须种植颜色以实现上述目标的顺序。
花园的前部由您的返回中的第一个元素表示
从你看着花园的意思是那里。 高度元素
一切都是独一无二的,所以总会有明确的顺序。
编辑二:
例子 1:
高度= {5,4,3,2,1}
Bloom = {1,1,1,1,1,11}
Wilt = {365,365,365,365}
返回: { 1, 2, 3, 4, 5 }
所有这些花朵绽放 1 1月份和褪色 31 十二月。 由于它们都可以互相阻塞,因此必须将它们从最短到最短的流中流。
例子 2:
n = {5,4,3,2,1}
B = {1,5,10,15,20}
z = {4,9,14,19,24}
返回: { 5, 4, 3, 2, 1 }
同一组颜色现在在不同的时间开花。 由于它们永远不会互相阻挡,因此您可以从最高到最短的最短以获得最高的前方。
例子 3:
高度= {5,4,3,2,1}
Bloom = {1,5,10,15,20}
Wilt = {5,10,14,20,25}
返回: { 3, 4, 5, 1, 2 }
这里的差异是第三种类型的花比第四的一天淡化。 所以我们可以先把鲜花高 3, 然后鲜花高 4, 然后高度 5 最后,鲜花高度 1 和 2. 请注意,我们还可以先订购它们的高度 1, 但这不会导致最高可能的高度将成为花园中的第一个。
http://www.topcoder.com/tc%3Fd ... tatic
. 而且我正试图提出一种基于的方法 DP, 对于一个问题
http://community.topcoder.com/ ... D5006
, 在问题列表中提到 1D DP.
我只能考虑与之相关的决定 DP, 这将包括按顺序排序颜色的初始排序,然后根据任务中提到的条件的各种检查重新排序。 它没有被归类为 DP, 是不是?
编辑文章也没有说 DP.
任何人都可以不小心向我施加对此问题的正确解决方案 DP?
谢!
编辑:
我不知道链接需要注册。 这是问题所在的地方:
分期任务
你用灯泡种植花园,全年给你快乐的花朵。 但是,你想植花
这样他们就不会阻挡其他花朵。
你会得到 int[] 生长, int[] 开花I. int[] 枯萎。
每种类型的花由具有相同索引的元素表示。
高度,开花和褪色。 高度代表高度
每种花类型,盛开代表每种花型时的早晨
它流出了地面,苗条代表每种类型的花都从地面流出时。
花皱纹和模具的类型。 开花和褪色中的每个元素
将有一个数字 1 到 365 包容性,我 wilt[i] 总是
会有更多 bloom[i]. 你必须种植这个世界的所有颜色。
出现一行中的相同类型,您也想要拥有
最高的花朵如下。 但是,如果一个
花的类型高于另一个,两种类型都可以是
陆地同时,必须以较短的花卉种植
较高的花以防止阻塞。 花朵绽放
早上和晚上褪色,所以即使一朵花绽放
在同一天,逐渐消失,一个人可以阻挡另一个花。
你必须返回 int[], 其中包含高度的元素
您必须种植颜色以实现上述目标的顺序。
花园的前部由您的返回中的第一个元素表示
从你看着花园的意思是那里。 高度元素
一切都是独一无二的,所以总会有明确的顺序。
编辑二:
例子 1:
高度= {5,4,3,2,1}
Bloom = {1,1,1,1,1,11}
Wilt = {365,365,365,365}
返回: { 1, 2, 3, 4, 5 }
所有这些花朵绽放 1 1月份和褪色 31 十二月。 由于它们都可以互相阻塞,因此必须将它们从最短到最短的流中流。
例子 2:
n = {5,4,3,2,1}
B = {1,5,10,15,20}
z = {4,9,14,19,24}
返回: { 5, 4, 3, 2, 1 }
同一组颜色现在在不同的时间开花。 由于它们永远不会互相阻挡,因此您可以从最高到最短的最短以获得最高的前方。
例子 3:
高度= {5,4,3,2,1}
Bloom = {1,5,10,15,20}
Wilt = {5,10,14,20,25}
返回: { 3, 4, 5, 1, 2 }
这里的差异是第三种类型的花比第四的一天淡化。 所以我们可以先把鲜花高 3, 然后鲜花高 4, 然后高度 5 最后,鲜花高度 1 和 2. 请注意,我们还可以先订购它们的高度 1, 但这不会导致最高可能的高度将成为花园中的第一个。
没有找到相关结果
已邀请:
11 个回复
郭文康
赞同来自:
它也让我尴尬,因为
https://www.topcoder.com/commu ... nced/
将其指在该部分中的实际任务 “Elementary”.
从最短到最短的最短鲜花。 从空白的行列表开始。 对于每朵花 /从最短到最高点/ 找到你可以插入这朵花的最前部的地方,以便它不会阻挡他身后的花朵。
在 Python 年:
莫问
赞同来自:
这是我经过验证的工作代码。
裸奔
赞同来自:
这是我的贪婪方法 java, 类似于其他,已经发布,关键点是按高度的顺序行动。 原因是避免使用中高 /召回已经计算过/, 考虑到这一点
中间高度可以改变先前计算的相对顺序
.
这是我能找到的唯一最佳子结构。 但考虑到字幕之间没有重叠,不应考虑该算法 DP, 和贪婪。
BTW, 解决方案 DP, 在这个例子中,我在这里看到了这一点。
舟
</integer></integer></integer></integer></integer>
莫问
赞同来自:
</integer></integer></integer></integer></integer></integer></integer></integer></integer></integer></integer></integer></integer></integer>
裸奔
赞同来自:
例如,如果我们有三种类型的颜色高度 4,2 和 1, 在同一天生长和死亡,得到的树应该是:
另一方面,如果 4 和 2 和 4 和 1 同时生活但是 2 和 1 不要共存,那么得到的树应该是:
这将创建一个与问题禁忌症一致的树。 尽管如此,问题的设置还包括成本函数,使其比其他解决方案更好。
..你还想要在靠近前方的行中的鲜花,尽可能高。
在树上投射这种偏好的方法是安排所有 "brothers" /所有具有相同父级的节点/ 从较高到更低。 因此, 2 站在第一个地方 1.
我使用以下代码构建了这棵树:
此时每一行 /i/
团体
包含,从较高到更高的索引,所有类型颜色的索引必须放在索引花的类型前
i
.
最后一步是必要的
团体
在输出矢量。 也就是说,构建每个元素应该是:
他的父母在树上。
他是下一个弟弟,当时身高。
这可以通过对每个节点的深度访问来完成。
团体
. 我认为这是我决定的弱点。 我没有那么多时间,所以我刚刚制作了天真的递归实施:
用于完成功能 getOrdering:
如果您找到了最佳解决方案或了解改善我的方法,请告诉我。
</int></vector<int></int></vector<int></int></int></int></int></int></int></int></int></int></int></vector<int></vector<int></int></vector<int></int></int></int></int></int></int></int></int></int></int></int>
卫东
赞同来自:
</struct></queue></vector></stdlib.h></stdio.h>
君笑尘
赞同来自:
喜特乐
赞同来自:
创建面向的图形/V, E/:
V - > 花的类型
E - > 关系之间的关系 2 花的类型
有关更详细的描述,请查看此论坛:
https://apps.topcoder.com/foru ... 55393
詹大官人
赞同来自:
风见雨下
赞同来自:
必须
放在他身后。 以同样的方式,他还从前面搜索并检查他的身后是否落后于他; 如果是这样,这意味着他
必须
放在它面前。 如果没有块,它只是检查身高的最佳位置。
EDIT: 这个解决方案是可怕的,我提出了最好的,这实际上是 DP; 它包括以下内容:对于每朵花,通过所有其他花,检查其中哪一个它;对于那些它块的颜色,检查它块的所有颜色,依此类推,直到您到达没有阻止其他人的花。将这朵花放在一个新的阵列中。回来并将每一花朵放在这个新的肿块的下一个插槽前面。如果您为每种花卉执行此操作,您将获得一个装满颜色的数组,这些颜色不会阻挡其他颜色。然后你把每朵花都放在前面。 DP 其中一些决定是有时你会遇到同一朵花,它已经被另一个花朵被另一个花朵被封锁,并且已经放在一个新的阵列中,所以我们跳过这朵花,而不是追求它阻塞的花朵。
</stdbool.h></stdlib.h></stdint.h></stdio.h>
小明明
赞同来自:
这是代码 :-
[code]#include<iostream>
#include<vector>
#include<utility>
#include<algorithm>
using namespace std;
bool comp/pair<int, pair<int,int=""> >& a,pair<int, pair<int,int=""> >& b /{
return /a.first > b.first/;
}
bool justify/pair<int, pair<int,int=""> >& a,pair<int, pair<int,int=""> >& b, int k , int
j, vector<pair<int,pair<int,int> > >& v/{
if///b.second.first <= a.second.first/ && /b.second.second>= a.second.first// ||
//b.second.first <= a.second.second/ && /b.second.second>= a.second.second// ||
//b.second.first > a.second.first/ && /b.second.second < a.second.second/ //{
pair<int, pair<int,int=""> > temp = v[j];
int i = j-1;
while/i >= k/{
v[i+1] = v[i];
i--;
}
v[k] = temp;
return true;
}
return false;
}
int main// {
vector<pair<int,pair<int,int> > > v;
int n,a,b,c;
cin>>n;
for/int i = 0;i < n;i++/{
cin>>a>>b>>c;
v.push_back/make_pair/a,make_pair/b,c///;
}
sort/v.begin//, v.end//, comp/;
for/int j = 1;j < n;j++/{
for/int k = 0;k < j;k++/{
bool res = justify/v[k],v[j], k, j, v/;
if/res/
break;
}
}
cout<<"output"<<endl; "<<v[i].second.first<<"="" "<<v[i].second.second<<endl;="" 0;="" <="" code]="" cout<<v[i].first<<"="" div="" for="" i="0;i" int="" n;i++="" return="" {="" }="" }[="">
</endl;></pair<int,pair<int,int></int,></pair<int,pair<int,int></int,></int,></int,></int,></algorithm></utility></vector></iostream>