第一行 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 }