刚开始用的动态规划+贪心
知道转移方程,但不知如何实现
下面为别人的思想:
【
设 f [i,j] 表示齐王按从强到弱的顺序出马和田忌进行了 i 场比赛之后,田忌从“头”取了 j 匹较强的马,从“尾”取了 i-j 匹较弱的马,所能够得到的最大盈利。
状态转移方程如下:
f[i,j]=max{f[i-1,j]+g[n-(i-j)+1,i],f[i-1,j-1]+g[j,i]}
其中g[i,j]表示田忌的马和齐王的马分别按照由强到弱的顺序排序之后,田忌的第 i 匹马和齐王的第 j 匹马赛跑所能取得的盈利,胜为200,输为-200,平为0。
】
若读者知道怎样实现,请留言分享您的思路,谢谢
哎,又参考了别人的代码,贪心,太贪心了
代码有改动,感谢纠错
代码如下:
#include<stdio.h> #include<stdlib.h> int cmp(const void *a,const void *b) //按速度由快到慢排序 { return *(int*)b-*(int*)a; } int main() { int n,i; int t[1005],k[1005]; while(scanf("%d",&n),n) { for(i=1; i<=n; i++) scanf("%d",&t[i]); for(i=1; i<=n; i++) scanf("%d",&k[i]); qsort(t+1, n, sizeof(t[0]), cmp) ; //给田忌的马排序 qsort(k+1, n, sizeof(k[0]), cmp) ; // 国王 int t_first, k_first, t_last, k_last; t_first = k_first = 1,t_last = k_last = n ; int flag = 1, ans = 0; while(flag) { if(t_first == t_last) flag = 0; //最后一匹了 if(t[t_first] > k[k_first]) //若当前田忌最快的马比国王最快的马快 { t_first++; //让它俩比吧,田忌最快的马变成下一匹 k_first++; ans += 200; } else if(t[t_last] > k[k_last]) { t_last--; k_last--; ans += 200; } else //以上都不满足,下面注意了。。。 { if(t[t_last] < k[k_first]) //若田最慢比国王最快的慢,比,此if只对ans -= 200有效 ans -= 200; t_last--; //上面的if若成立,执行这两句,不成立同样执行 k_first++; //那就是田最慢与国王最快同速 } } printf("%d ",ans); } return 0; }