刚开始用的动态规划+贪心
知道转移方程,但不知如何实现
下面为别人的思想:
【
设 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\n",ans);
}
return 0;
}
HDU-1052-Tian Ji -- The Horse Racing,码迷,mamicode.com