C语言怎么计算算法效率,C语言的数字游戏算法效率问题探讨实例

本文探讨了一种数字游戏的最优路径求解策略,通过对比递归和迭代方法,展示了迭代算法在计算n*m网格中最高分数时的高效性。作者分享了两种实现方式的代码并分析了它们的时间复杂性,最终提出迭代算法显著提升了执行效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近做了这样一个题目,感觉挺有趣~题目如下:

问题描述

Winder 最近在玩一个数字游戏,该游戏是在一个n*m 的网格上进行的,每个格子上有 一个数字,代表这个格子的数值。玩家需要从网格的左上角的格子走到右下角的格子,每次 只能向右或者向下走,并且不能回头。玩家每经过一个格子可以选择分值是否加上该格子的 数值,每次游戏的初始分数都是0。

Winder 想知道在每场游戏,他最多能够得到多少分值。但是,Winder 很懒,所以你必 须帮他来完成这件事。

数据输入

输入第一行两个正整数N 和M(0

数据输出

输出一行一个整数,表示该场游戏能取得的最高分数sum。(保证sum 在32 位整数范围 内)。

上面这个问题就是numberGame,考虑到每一步都有且只有向右和向左两个选择,故用递归算法会很方便,代码如下:

#include

#include

#include

#pragma comment(lib,"winmm.lib")

using namespace std;

int j=0;

int go(int kc,int *Ac,int wc,int nc)

{

if(kc>=j) return wc;

if(kc

{

if((kc+1)%5==0)

return go(kc+nc,Ac,Ac[kc]+wc,nc);

else

return go(kc+1,Ac,Ac[kc]+wc,nc)>go(kc+nc,Ac,Ac[kc]+wc,nc)?go(kc+1,Ac,Ac[kc]+wc,nc):go(kc+nc,Ac,Ac[kc]+wc,nc);

}

}

void main()

{

int m,n;

DWORD   t1,   t2;

cin>>m>>n;

int *A,i,w=0;

A=new int [m*n];

for(i=0;i

{

if(i!=0&&i%n==0)cout<

cin>>A[i];

}

j=m*n;

t1=timeGetTime();

int max=go(0,A,w,n);

cout<

t2=timeGetTime();

cout<

}

代码执行时间为46MS,由于最大权值路径上每个节点的前驱只能是其上方的节点或其左边的节点(最左的节点除外),故可用一个一维数组存储每个节点前驱的最大权值,代码如下:

#include

int i,j,dp[16],n,m,v;

void main(){

scanf("%d%d",&n,&m);

for(i=0;i

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

scanf("%d",&v);

if(dp[j]

dp[j]+= v>0?v:0;

}

printf("%d\n",dp[m]);

}

此代码用了类似迭代的算法,代码执行时间为30MS,可知此代码效率比上面的代码效率高,并且代码要比前者简单的多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值