River Crossing 简单的动态规划 .

第一行 t  表示有几组测试数据 . 

 每组测试数据的 第一行是 n, m   .     然后 下面有n行数据  .  

     题意:有1个人和N只羊要过河。一个人单独过河花费的时间是M,每次带一只羊过河花费时间M+M1,带两只羊过河花费时间M+M1+M2……给出N、M和Mi,问N只羊全部过河最少花费的时间是多少。

  相当于 , 羊都是一样的 , 但是羊 数量的不同 , 导致该羊 在  船上的增加水阻力的大小也不同 , Mi 是不论那只羊 , 只要数量是 i 那么该羊在船上就增加了 Mi 个阻力 . 

理解了题意 , 接下来就是  状态转移了.

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<math.h>
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<queue>
 7 #include<vector>
 8 #include<set>
 9 #include<stack>
10 #include<string>
11 #include<sstream>
12 #include<map>
13 #include<cctype>
14 #include<limits.h>
15 using namespace std;
16 int dp[1005],time1[1005];
17 int main()
18 {
19     int t,n,m;
20     scanf("%d",&t);
21     while(t--)
22     {
23         scanf("%d%d",&n,&m);
24         for(int i=1;i<=n;i++)
25         {
26             scanf("%d",&time1[i]);
27             time1[i]=time1[i]+time1[i-1];       // 这也算是 惯用手段了 . 
28         }
29         for(int i=1;i<=n;i++)
30         {
31             dp[i]=time1[i]+m;       //   默认一下 , 前 i 只羊的最短用时  
32             for(int j=1;j<i;j++)
33             {
34                 dp[i]=min(dp[i],dp[i-j]+dp[j]+m);     //    现在  虽然 dp[i] 是不是最小 是未知的 , 但是 i 之前的 都已经是已知的了 . 可以这样 晚饭一次 看看能不能节省时间 
35             }
36         }
37         printf("%d\n",dp[n]);
38     }
39 }

 

 

       

       

       

       

       

       

       

       

 

转载于:https://www.cnblogs.com/A-FM/p/5512228.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值