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 }