- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
..练习参考【DOC精选】
1、
直接按照题意画出图像如下:
几种方法比较:
100个元素,枚举是行不通的。
贪心策略可能会丢掉最优解,也是不行的。
分治法有大量的重复计算,不好。
自然想到动态规划。
算法分析
动态规划的两个基本步骤:构造状态网络和寻找递推关系。由题意直接得到的图中路径和点本身都有值,网络构造复杂。由于起始点不确定,很难将图上的点进行拓扑排序,更难寻找初值和递推关系。
解决方法
联想到单源最短路径问题需要有起始点。
加入一点S作为起始点,得到新图如下:
化成了动态规划中最简单的最短路径问题
拓扑顺序:S 4 3 2 1
递推关系:
令状态量Dis[k]表示顶点S到顶点k的最短距离,则有状态转移方程:
算法实现
数据结构
需要一个Dis数组存放每一点到S的最短路径。
运算过程:
从1开始拓扑排序
从S开始逐次计算
参考:
#includeiostream
using namespace std;
int M,N;
int value[101][3];//value[i][0]:得到i需要多少钱
int g[101][101]; //value[i][1]:i的等级
//value[i][2];刚输入时代表可替换的种类,后来表示是否可交换
int Dijkstra()
{
int dist[101];
int i,j;
for(i=1;i=N;i++)
dist[i]=g[0][i];
for(i=1;i=N;i++)
{
int temp=INT_MAX;
int u=0;
for(j=1;j=N;j++)
{
if(value[j][2]==0dist[j]temp)
{
temp=dist[j];
u=j;
}
}
if(u==0) break;
value[u][2]=1;
for(j=1;j=N;j++)
{
if(value[j][2]==0g[u][j]0dist[u]+g[u][j]dist[j])
{
dist[j]=dist[u]+g[u][j];
}
}
}
return dist[1];
}
void solve()
{
int temp=INT_MAX;
int i,j;
for(i=1;i=N;i++)
{
int rank=value[i][1];
for(j=1;j=N;j++)
{
if(value[j][1]rank||rank-value[j][1]M)
value[j][2]=1;
else
value[j][2]=0;
}
int t=Dijkstra();
if(ttemp)
temp=t;
}
couttempendl;
}
int main()
{
cinMN;
int i,j;
memset(g,0,sizeof(g));
for(i=1;i=N;i++)
{
cinvalue[i][0]value[i][1]value[i][2];
g[0][i]=value[i][0];
for(j=1;j=value[i][2];j++)
{
int n,v;
cinnv;
g[n][i]=v;
}
}
solve();
system(pause);
return 0;
}
2
属于几何题,解题思路:
假设给定了P点。墙为。
由于最后一扇门肯定在正方形的边界上,而且可以假设最后一扇门在一堵连续的墙的中间。我们对于所有这样的中点进行枚举,对每一个中点都求出要从给定点P到达此中点的所需要的最少的门的个数。
假设一个中点为Q。我们考虑直线PQ。
定理一:如果PQ和相交,那么要想从P到Q,则需要在墙上开一扇门。
证明:显然。
定理二:可以在所有与PQ相交的墙上开一扇门,使得可以从P走到Q。
证明:连接PQ,若PQ没有
文档评论(0)