题目大意就是一个人要送羊过河。
每次送的羊的数量不同 所花费的时间也不同。问把羊全部送到河对岸所需的最短的时间
dp问题。
前缀数组sum[i]表示送i只羊所花的时间。
我们可以用dp[i]表示送i只羊过河所需的最少时间
如果送的第i-1只羊的最短时间为dp[i-1],那么对于第i只羊有两种情况
- 人返回再送羊过河
- 和前面的某些羊一起送
即:
for(int j=1;j<i;j++)
{
dp[i]=min(dp[i-1]+t[0]+m*2,dp[j]+sum[i-j]+m*2);
}
AC代码:
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
int main()
{
int k;
int t[1005];
int dp[1005];
int sum[1005];
scanf("%d",&k);
while(k--)
{
int n,m;
memset(dp,100,sizeof(dp));
memset(sum,0,sizeof(sum));
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++){
scanf("%d",&t[i]);
sum[i+1]=sum[i]+t[i];
}
dp[1]=t[0]+m;
for(int i=2;i<=n;i++)
{
dp[i]=min(dp[i-1]+t[0]+m*2,sum[i]+m);
for(int j=1;j<i;j++)
{
dp[i]=min(dp[i],dp[j]+sum[i-j]+m*2);
}
}
printf("%d\n",dp[n]);
}
return 0;
}