田忌赛马(动态规划)

时限:

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;
}

 

posted on 2012-07-11 22:47  IThinktan  阅读(2952)  评论(0编辑  收藏  举报

导航