zoukankan      html  css  js  c++  java
  • 一个菜鸟学习动态规划算法的过程

        这段时间在看基因调控网络相关的文章,涉及最多的就是评分函数和搜索算法,而搜索算法中比较经典的算是贪心算法(局部最优)了,于是我拿起了算法导论这本书来摸索,看着看着,发现还是要先看一下动态规划才比较有基础,然后发现还是得先看看分治模式才比较靠谱,于是故事就这样开始了、、、、、

        先是编程上面遇到的问题,由于本人不是计算机专业的,但是很热爱计算机,所以C、C++、JAVA都有涉及,但是最坑爹的是经验不足,败在了函数上面,所以,只能多看文档啦,先说说今天动态规划遇到的问题

    #include <iostream>
    #include <algorithm>
    using namespace std;

    int cut_rod(int *p, int n);

    int main()
    {
    int q, n, p[11] = {0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30}; //q为最大价格,n为钢材长度,p数组为价格目录
    cout << "请输入钢材的长度:";
    cin >> n;

    q = cut_rod(p, n);

    cout << "最大收益为 "<< q << endl;
    return 0;
    }

    int cut_rod(int *p, int n)
    {
    int q = -1e8;

    if (n == 0)
    {
    return 0;
    }
    else
    {
    for(int i = 1; i <= n; i++)
    {
    q = max(q, p[i] + cut_rod(p, n-i));
    }
    }

    return q;
    }

    这是我自己写的一个关于求一个n长的钢条的最有切割问题的递归算法,当n=17的时候都没有问题,可是到18后就开始出现一堆不知所云的东西了,于是上网找了个靠谱的算法

    #include<iostream>
    #include<cstring>
    using namespace std;
    int p[1000],r[1000],s[1000];
    void cut_rod(int* a,int b)
    {
    r[0]=0;
    for(int i=1;i<=b;i++)
    {
    int q=-1e8;
    for(int j=1;j<=i;j++)
    {
    if(q<(a[j]+r[i-j]))
    {
    q=a[j]+r[i-j];
    s[i]=j;
    r[i]=q;
    }
    }
    }
    cout<<r[b]<<endl<<s[b]<<endl;
    }
    int main()
    {
    int n;
    cin>>n;
    memset(p,0,sizeof(p));
    memset(r,0,sizeof(r));
    memset(s,0,sizeof(s));
    for(int i=1;i<=n;i++)
    cin>>p[i];
    cut_rod(p,n);
    return 0;
    }

    由于本人小菜,第一下就被主函数里面的memset()函数懵到了,或许是他太不耀眼了,看了很多书和视频都没有发现过他的存在,于是百度了一下,总结了一些大神经验,这里简洁介绍下

    函数解释:将s中前n个字节 (typedef unsigned int size_t)用 ch 替换并返回 s 。
    memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体数组进行清零操作的一种最快方法
     
    很简单,就是给指定内存段初始化。然后又在memset的示例里面看到了一个函数,又没见过
    #include "iostream.h"
    #include "string.h"
    #include <afx.h>
    int main(){
        char buf[5];
        CString str;
        CString str1;
        CString str2;
        memset(buf,0,sizeof(buf));
        for(int i = 0; i<5; i++){
            str.Format("%d",buf[i]);
            str1 +=str ;
        }
        str2.Format("%d",str1);
        cout<<str2<<endl;
        system("pause");
        return 0;
    }
     
    Format()函数,百度了下,在百科里面的用法这里都不是,于是百度了下str.format()函数的用法,如下:
    int转换为CString:
      CString str;
      int number=15;
      //str="15"
      str.Format(_T("%d"),number);
      //str=" 15"(前面有两个空格;4表示将占用4位,如果数字超过4位将输出所有数字,不会截断)
      str.Format(_T("%4d"),number);
      //str="0015"(.4表示将占用4位,如果数字超过4位将输出所有数字,不会截断)
      str.Format(_T("%.4d"),number);
      long转换为CString的方法与上面相似,只需要把%d改为%ld就可以了
     
    这是MFC编程的代码,但是这个函数的功能也很明了了,就是一个类型转换功能的函数,并且可以自选长度,就先说到这,有不妥的请指正,
                                                                     初入门的编程小菜鸟一枚!!
     
     
  • 相关阅读:
    Java集合概述
    Java8内存结构—永久代(PermGen)和元空间(Metaspace)
    ArrayList分析
    “三次握手,四次挥手”你真的懂吗?
    Object中的方法以及对象相等的判定
    笔记
    Mybatis中的@Param注解
    react与jQuery对比,有空的时候再翻译一下
    队列理论和队列网络模型 queueing theory and queueing network model
    下拉列表autocomplete各种实现方式比较
  • 原文地址:https://www.cnblogs.com/yican/p/3301382.html
Copyright © 2011-2022 走看看