田忌赛马(动态规划)

时限:

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;

}

 

你可能感兴趣的:(动态规划)