zoukankan      html  css  js  c++  java
  • 田忌赛马(动态规划)

    时限:

    1000ms 内存限制:10000K  总时限:3000ms

    描述:

    田忌与齐王赛马,双方各有n匹马参赛(n<=100),每场比赛赌注为1两黄金,现已知齐王与田忌的每匹马的速度,并且齐王肯定是按马的速度从快到慢出场,现要你写一个程序帮助田忌计算他最好的结果是赢多少两黄金(输用负数表示)。

    输入:

    多个测例。 每个测例三行:第一行一个整数n,表示双方各有n匹马;第二行n个整数分别表示田忌的n匹马的速度;第三行n个整数分别表示齐王的n匹马的速度。 n=0表示输入结束。

    输出:

    每行一个整数,田忌最多能赢多少两黄金。

    输入样例:

    3
    92 83 71
    95 87 74
    2
    20 20
    20 20
    2
    20 19
    22 18
    3
    20 20 10
    20 20 10
    0

    输出样例:

    1
    0
    0
    0

    #include<stdio.h>
    int T[100],Q[100],n;//田忌,齐王的n匹马的速度
    int search()
    {
        int i,j,temp;
        int Inco[100][100]={0};//l[i][j]:齐王从i开始到第i+j匹马共j+1匹马
                              //       与田忌从0开始到第0+j匹马共j+1匹马比,(田忌)的最大收益
        for(i=0;i<=n-2;i++)//选择排序(降序)    
            for(j=i+1;j<=n-1;j++)
            {
                if(T[i]<T[j])//田忌的马
                {    temp=T[i];    T[i]=T[j];    T[j]=temp;    }
                if(Q[i]<Q[j])//齐王的马
                {    temp=Q[i];    Q[i]=Q[j];    Q[j]=temp;  }
            }
        
        for(i=0;i<n;i++)//齐王的每一匹马与田忌的最快的(第一匹)马比
        {    if(Q[i]<T[0])    Inco[i][0]=1;
            else if(Q[i]==T[0])    Inco[i][0]=0;
            else    Inco[i][0]=-1;
        }
        for(i=n-2;i>=0;i--)//齐王从第i匹马开始比 
        {
            for(j=1;i+j<n;j++)//增加比赛马匹数j(齐王赛马最大下标:i+j<n)
            {
                if(Q[i+j]<T[0+j])//田忌从第0匹马开始(田忌赛马最大下标:0+j)
                    Inco[i][j]=Inco[i][j-1]+1;
                else if(Q[i+j]>T[0+j])
                    Inco[i][j]=Inco[i+1][j-1]-1;
                else 
                {    if(Inco[i+1][j-1]-1>Inco[i][j-1]+0)//l[i+1][j-1]-1:齐王第i号马与田忌第第j号马比,田忌必输(-1)
                       Inco[i][j]=Inco[i+1][j-1]-1;    //l[i][j-1]+0:齐王的第i+j号马与田忌的第j号马比为平局(0)
                    else                         //l[i+1][]必定在l[i][]之前获得(i--)
                        Inco[i][j]=Inco[i][j-1]+0;
                }
            }
        }
        return Inco[0][n-1];//齐王从0匹马开始到最后一匹马共n匹马与田忌的n匹马比的最大收益
    }
        
    int main()
    {
        int i;
        scanf("%d",&n);
        while(n!=0)
        {
            for(i=0;i<n;i++)
                scanf("%d",&T[i]);
            for(i=0;i<n;i++)
                scanf("%d",&Q[i]);
            printf("%d\n",search());
    
            for(i=0;i<100;i++)
            {  T[i]=0;  Q[i]=0;     }
            scanf("%d",&n);
        }
        return 0;
    }
  • 相关阅读:
    二进制数组ArrayBuffer
    iperf3测量一个网络最大带宽
    Proxy与Reflect
    Symbol
    Iterator
    Set与Map
    Generator
    Android 共享参数 SharedPreferences
    DDMS files not found: xxxhprof-conv.exe
    Android 状态栏通知 Notification
  • 原文地址:https://www.cnblogs.com/IThaitian/p/2587184.html
Copyright © 2011-2022 走看看