题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=716
题目大意是:一个人和n个羊过河,但是只有一个船,如果载i只羊过河需要时间为t,则载i+1只羊过河 则需要多费时a[i];其中这个人自己过河需要时间为m,为把n个羊和1个人弄到河对岸最少需要多少时间:
就是一简单dp,省赛的时候3个dp就这个最简单了,
设f[i]为带i只羊过去需要花费的时间,则f[i]=max(f[i],f[i-j]+f[j]+m);其中j从1到i;
初始化数组f时可以令f[i]为一次带过去完需要的时间,然后两层循环就可以求出f[n]了;
参考代码如下:
#include <iostream>
#include <cstring>
using namespace std;
int a[1001];
int n,m;
int f[1001];
void execute()
{
memset(f,0x7E,sizeof(f));
int i,j;
f[0]=m;
for(i=1;i<=n;i++)
f[i]=f[i-1]+a[i];
for(i=2;i<=n;i++)
{
for(j=1;j<=i;j++)
{
if(f[i]>f[j]+f[i-j]+m)
f[i]=f[j]+f[i-j]+m;
}
}
cout<<f[n]<<endl;
}
int main()
{
int i;
int T;
cin>>T;
while(T--&&cin>>n>>m)
{
for(i=1;i<=n;i++)
cin>>a[i];
execute();
}
return 0;
}