
程序卡在在线调试STM32 卡在LDR R0, = SystemInit_ExtMemCtl的解决办法如下:
出现最多的情况就是设置的 断点过多,可以把断点全部删除试试看 ,把断点设置在主函数。
在程序中使用了C库(printf),那么进入Option---target将usemicroLib勾选上。
硬件原因,主芯片,或者晶振有问题,更换一下就好了
你的代码是贪心的思想,比如求最少丢骰子数时
就选择每次丢骰子能达到的最远距离
但有个问题,有可能在某格跳过的格子中,被跳过格子反而能跳过更多的格子
这样的话结果就不正确了,如输入如下示例:
9 3
0 0 2 5 0 0 0 0 0
按你的代码,第一次丢骰子能前进的最远处为从2跳至5后的0,后续还需要丢两次
因此最少丢骰子数为3;但其实丢两次就可以,第一次走到前两个0中的任意一个
第二次走到5的位置,就能直接跳到结尾了
这里提供一种动态规划的思想,新建两个数组max_dp和min_dp,分别保存从当前格子
出发到最后所需要的最多和最少丢骰子数,然后逆序遍历每个位置,最终0处的值即为所求
具体代码和运行结果如下:
如图可知,输入以上实例,动态规划思想得出的最少丢骰子数为2,是正确的
附源码:
#include <stdio.h>
#define max(a, b) ((a) >(b) ? (a) : (b))
#define min(a, b) ((a) <(b) ? (a) : (b))
#define N 1000001
int a[N] = {0}, max_dp[N], min_dp[N]
int main() {
int n, m, i, j
scanf("%d %d", &n, &m)
for (i = 1i <= ni++)
scanf("%d", &a[i])
for (i = 0i <ni++) {
max_dp[i] = 0// 最多丢骰子数初始化为最小值
min_dp[i] = n// 最少丢骰子数初始化为最大值
}
max_dp[n] = min_dp[n] = 0// 最后一格不用丢骰子
for (i = n - 1i >= 0i--) { // 逆序遍历
if (a[i] >0) { // 直接按格子前进
j = min(i + a[i], n)
max_dp[i] = max_dp[j]
min_dp[i] = min_dp[j]
}
else { // 需要丢骰子
for (j = i + 1j <= min(i + m, n)j++) {
max_dp[i] = max(max_dp[i], max_dp[j] + 1)
min_dp[i] = min(min_dp[i], min_dp[j] + 1)
}
}
}
printf("%d %d\n", max_dp[0], min_dp[0])// 0处的值即为所求
return 0
}
注意:动态规划代码的时间复杂度为O(n*m),根据题目所给的数据范围
是有可能超时的,应该还有更高效的算法,所以这里仅供参考~
不要放在U盘中运行。不要放在桌面运行。机子配置太差。或者是多系统中,内存被限制在了一定范围内运行程序就会很慢。
C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。
简介:
C语言是一门面向过程的计算机编程语言,与C++、C#、Java等面向对象编程语言有所不同。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、仅产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
C语言描述问题比汇编语言迅速、工作量小、可读性好、易于调试、修改和移植,而代码质量与汇编语言相当。C语言一般只比汇编语言代码生成的目标程序效率低10%-20%。因此,C语言可以编写系统软件。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)