• 动态规划递归—最小子段和


    #include <stdio.h> 
    #include <stdlib.h>
    #include <time.h>
    int j,a[1000];
    void main() {
    int i,k,n,t,s,smin;
    int q(int j);
    t=time(0)%1000;srand(t); // 随机数发生器初始化
    printf(" 序列中n个正负项,请确定n:");
    scanf("%d",&n);
    printf(" 序列的%d个整数为: ",n);
    for(i=1;i<=n;i++) {
    t=rand()%(4*n)+10;
    // 随机产生n个整数
    if(t%2==1) a[i]=-1*(t-1)/2;
    // 把奇数变为负数,大小减半
    else a[i]=t/2;
    // 把偶数大小减半
    printf("%d,",a[i]); }
    smin=1000;
    for(j=1;j<=n;j++)
    if(q(j)<smin)
    // 调用递归函数,比较得最小值 {
    smin=q(j);k=j;}
    printf(" 最小子段和为:%ld ",smin);
    for(s=0,i=k;i>=1;i--)
    // 反推最小和子段的首标i
    { s+=a[i]; if(s==smin) break; }
    printf(" 最小子段从序列的第%d项到第%d项。 ",i,k); }
    int q(int j)
    // 定义递归函数q(j)
    {int f;
    if(j==0) f=0;
    else { if(q(j-1)>=0) f=a[j];else f=q(j-1)+a[j]; }
    return f; }

     

  • 相关阅读:
    mvc原理和mvc模式的优缺点
    Paxos算法详细图解
    环境搭建
    elasticsearch 安装
    redis rdb文件解析
    eclipse 远程调试
    java 解析xml
    理想化 redis
    redis 内存
    工作圈redis 使用
  • 原文地址:https://www.cnblogs.com/ljs-666/p/8045134.html
Copyright © 2020-2023  润新知