田忌赛马(动态规划)
时限:
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 阅读(3060) 评论(0) 编辑 收藏 举报