zoukankan      html  css  js  c++  java
  • 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
    ",dp[n]);
    38     }
    39 }

           

           

           

           

           

           

           

           

  • 相关阅读:
    如何保存一张网页上的图片(C#)到本地计算机上
    SQL Server2005常用基本管理操作
    C#保存图片到数据库,读取图片显示
    简析正则表达式
    HDU 变形课
    HDU 1272 小希的迷宫
    HDU 1856 More is better
    POJ 1269 Intersecting Lines
    HDU Football Score
    HDU 1213 How Many Tables
  • 原文地址:https://www.cnblogs.com/A-FM/p/5512228.html
Copyright © 2011-2022 走看看