• algorithm ch15 FastWay


    这是DP最基础的一个问题,刚开始学习这一块,实现了一下,不要黑我巨长的参数表,新手。

    代码如下:

    void FastWay(int l1[], int l2[], int e1, int e2, int x1, int x2, int t1[], int t2[], int n)
    {
        int f1[6] ={0};
        int f2[6] ={0};
        int l[12] = {0};
        f1[0] = e1 + l1[0];
        f2[0] = e2 + l2[0];
        int lres = 0;
        int fres = 0;
        int offset = 0;
    
        for(int i = 1; i < n; ++i)
        {
            if((f1[i-1] + l1[i]) <= (f2[i-1] + t2[i-1] + l1[i]))
            {
                l[i] = 1;
                f1[i] = f1[i-1] + l1[i];
            }
            else
            {
                f1[i] = f2[i-1] + t2[i-1] + l1[i];
                l[i] = 2;
            }
            if(f2[i-1] + l2[i] <= f1[i-1] + t1[i-1] + l2[i])
            {
                l[i+6] = 2;
                f2[i] = f2[i-1] + l2[i];
            }
            else
            {
                l[i+6] = 1;
                f2[i] = f1[i-1] + t1[i-1] + l2[i];
            }
        }
        if(f1[n-1] + x1 <= f2[n-1] + x2)
        {
            lres = 1;
            fres = f1[n-1] + x1;
            
        }
        else
        {
            lres = 2;
            fres = f2[n-1] + x2;
            offset = 6;
        }
        PrintWayRecurse(l, lres, n);
    }
    void PrintWayRecurse(int l[], int lres, int n)
    {
        if(n == 0)
            return;
        int offset = 0;
    
        if(lres == 2)
        {
            offset = 6;
        }
        else
        {
            offset = 0;
        }
        PrintWayRecurse(l, l[n -1 +offset], n-1 );
        cout << "line " << lres << " station " << n << endl;
        
    }

    这里是迭代输出的,当时教c语言的老湿真的是极力的反对我们用迭代,所有的迭代都可以用顺序语句实现,可是现在看算法这块好多将迭代的,感觉思维有点跟不上,困惑。

    然后写了个顺序执行的:

    void PrintWay(int l[], int lres, int offset, int n)
    {
        if(offset == 6)
        {
            cout << "line " <<  2 << " station" << n << endl;
        }
        else 
        {
            cout << "line " << 1 << " station" << n << endl;
        }
        for(int i = n-1; i> 0; --i)
        {
            cout << "line " << l[i + offset] << " station" << i << endl;
            if(l[i+offset] == 1)
                offset = 0;
            else
                offset = 6;
        }
        cout << "test" ;
    }

    代码有点乱,新手。。。

  • 相关阅读:
    Broadcom 43228 Kali Linux Ubuntu
    linux 栈空间查看和修改
    mininet 操作命令
    linux shell note
    进程与线程的区别
    JAVA基础--JAVA 集合框架(泛型、file类)
    HashMap的实现原理
    Java 流(Stream)、文件(File)和IO
    总结接口和抽象类的异同
    Java 泛型
  • 原文地址:https://www.cnblogs.com/bestwangjie/p/4438755.html
Copyright © 2020-2023  润新知