云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > 算法分析大作业

算法分析大作业

  • 62 次阅读
  • 3 次下载
  • 2025/5/22 23:48:08

#include %using namespace std; #define INF 10000 /*

f[i][j][0]表示汽车从网格点(1,1)行驶至网格点(i,j)所需的最少费用 f[i][j][1]表示汽车行驶至网格点(i,j)还能行驶的网格边数

s[i][0]表示x轴方向 s[i][1]表示y轴方向 s[i][2]表示行驶费用

f[i][j][0] = min{f[ i+s[k][0] ][ [j+s[k][1] ][0] + s[k][2]} f[i][j][1] = f[ i+s[k][0] ][ [j+s[k][1] ][1] - 1;

f[1][1][0] = 0 f[1][1][1] = K

f[i][j][0] = f[i][j][0] + A , f[i][j][1] = K 如果(i, j)是油库 f[i][j][0] = f[i][j][0] + C + A, f[i][j][1] = K (i, j)不是油库,且f[i][j][1] = 0 */

int N; //方形网络规模

int A; //汽车在行驶过程中遇到油库应加满油并付加油费A

int C; //在需要时可在网格点处增设油库,并付增设油库费用C(不含加油费A)

int B; //当汽车行驶经过一条网格边时,如果其x坐标或y坐标减少,应付费用B

int K; //装满油后,还能行驶K条边

int f[50][50][2];

int s[4][3] = {{-1,0,0},{0,-1,0},{1,0,B},{0,1,B}};

int a[50][50]; //方形网络

int dyna() {

int i, j, k; for (i=1;i<=N;i++) {

for (j=1;j<=N;j++) {

f[i][j][0]=INF; f[i][j][1]=K; } }

f[1][1][0] = 0; f[1][1][1] = K;

int count = 1; int tx, ty; while(count) {

count = 0;

for(i=1; i<=N; i++) {

for(int j=1; j<=N; j++) {

if(i==1 && j==1) continue; int minStep = INF; int minDstep; int step, dstep;

for(k=0; k<4; k++) //可走的四个方向 {

tx = i + s[k][0]; ty = j + s[k][1];

if(tx<1 || ty<1 || tx>N || ty>N) //如果出界

continue;

step = f[tx][ty][0] + s[k][2]; dstep = f[tx][ty][1] - 1; if(a[i][j] == 1) //如果是油库 {

step += A; dstep = K; }

if(a[i][j]==0 && dstep == 0 && (i!=N||j!=N)) //如果不是油库,且油已经用完 {

step += A + C; dstep = K; }

if(step < minStep) //可以走 {

minStep = step; minDstep = dstep; }

}

if(f[i][j][0] > minStep) //如果有更优解 {

count++;

f[i][j][0] = minStep; f[i][j][1] = minDstep; } } } }

return f[N][N][0]; }

int main() {

ifstream fin(\ cout << \输入方格规模:\ fin >> N; cout << N;

cout << \输入装满油后能行驶的网格边数:\ fin >> K; cout << K; cout << \输入加油费:\ fin >> A; cout << A;

cout << \输入坐标减少时应付的费用:\ fin >> B; cout << B; s[2][2] = s[3][2] = B; cout << \输入增设油库费用:\ fin >> C; cout << C;

cout << \输入方形网络:\\n\ for(int i=1; i<=N; i++) {

for(int j=1; j<=N; j++) {

fin >> a[i][j];

cout << a[i][j] << \ }

cout << endl; }

cout << \最优行驶路线所需的费用为:\ fin.close(); return 0; }

2.5最终结果

3.总结

动态规划(Dynamic Programming, DP)思想启发于分治算法的思想,也是将复杂问题化解若干子问题,先求解小问题,再根据小问题的解得到原问题的解。但是DP与分治算法不同的是,DP分解的若干子问题,往往是互相不独立的,这时如果用分治算法求解,那么会对重叠子问题重复进行求解,从而使得浪费大量的时间。那么如果我们保存已经计算过的子问题的解,这样当再次计算该子问题时,可以直接使用,这样可以节约大量的时间。 设计动态规划的四个步骤: 1、刻画一个最优解的结构特征。 2、递归地定义最优解的值。

3、计算最优解的值,通常采用自底向上的方法。 4、利用计算出的信息构造一个最优解。

搜索更多关于: 算法分析大作业 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

#include %using namespace std; #define INF 10000 /* f[i][j][0]表示汽车从网格点(1,1)行驶至网格点(i,j)所需的最少费用 f[i][j][1]表示汽车行驶至网格点(i,j)还能行驶的网格边数 s[i][0]表示x轴方向 s[i][1]表示y轴方向 s[i][2]表示行驶费用 f[i][j][0] = min{f[ i+s[k][0] ][ [j+s[k][1] ][0] + s[k][2]} f[i][j][1] = f[ i+s[k][0] ][ [j+s[k][1] ][1] - 1; f[1][1][0] = 0 f[1][1][1] = K f[i][j][0] = f[i][j][0] + A , f[i][j][1] = K 如

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com