pku 1946 Cow Cycling 非常好的DP

题意:
n头奶牛跑步,一个领跑,另外的跟跑。总距离是k,如果某一单位时间速度为v,则领队奶牛消耗v^2能量,其他奶牛消耗v能量。每头奶牛初始的能量相同。问奶牛们到达终点的最短时间。

解法:
其他不说了,重要的是第i个牛在哪几个时刻领队并不重要,重要的是领了多少个时间单位的队,下面状态就不难划分了吧?

代码:
 1 # include <stdio.h>
 2 # include <string.h>
 3 # include <stdlib.h>
 4 int dp[21][101][101],n,e,d;
 5 int solve(int used,int e1,int e2)
 6 {
 7    if(e1<0||e2<0return -1;
 8     else if(used>=n) return -1;
 9    else if(e-e2>=d) 
10        return 0;
11    else if(dp[used][e1][e2]!=-1return dp[used][e1][e2]==-2?-1:dp[used][e1][e2];
12    else
13    {
14       int i;
15       dp[used][e1][e2]=-2;
16       for(i=1;e1-i*i>=0;i++)
17          if(solve(used,e1-i*i,e2-i)!=-1&&(dp[used][e1][e2]==-2||solve(used,e1-i*i,e2-i)+1<dp[used][e1][e2]))
18             dp[used][e1][e2]=solve(used,e1-i*i,e2-i)+1;
19       for(i=1;e2-i*i>=0;i++)
20          if(solve(used+1,e2-i*i,e2-i)!=-1&&(dp[used][e1][e2]==-2||solve(used+1,e2-i*i,e2-i)+1<dp[used][e1][e2]))
21             dp[used][e1][e2]=solve(used+1,e2-i*i,e2-i)+1;
22 
23       return dp[used][e1][e2]==-2?-1:dp[used][e1][e2];
24    }
25 }
26 int main()
27 {
28     scanf("%d%d%d",&n,&e,&d);
29     memset(dp,-1,sizeof(dp));
30     printf("%d\n",solve(0,e,e)==-1?0:solve(0,e,e));
31     //system("pause");
32     return 0;
33     
34 }

posted on 2011-02-05 01:13 yzhw 阅读(315) 评论(0)  编辑 收藏 引用 所属分类: DP


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2011年1月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
303112345

导航

统计

公告

统计系统

留言簿(1)

随笔分类(227)

文章分类(2)

OJ

最新随笔

搜索

积分与排名

最新评论

阅读排行榜