擦,第一次数组开小了,后来看到了一个跟我一样的方程的代码,数组大小很大,我把数组改大了就A掉了
浪里格朗
枚举每个月的工人数量,枚举上个月工人的数量
在进行dp进行状态转移,这个方程很容易想到,看代码就明白了
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int n;int used[29999];
int dp[15][29999];
int main()
{
int zhao,yue,gong;
int minn,maxx;
while(scanf("%d",&n)!=EOF)
{
if(n<=0)break;
minn=22222;maxx=-33333;
scanf("%d%d%d",&zhao,&yue,&gong);
int i,j;
for(i=1;i<=n;i++)
{
scanf("%d",&used[i]);
maxx=max(maxx,used[i]);
minn=min(minn,used[i]);
}
memset(dp,222222,sizeof(dp));
int k;
for(i=minn;i<=maxx;i++)
dp[1][i]=yue*i+zhao*i;
for(i=2;i<=n;i++)
for(j=used[i-1];j<=maxx;j++)
{
for(k=used[i];k<=maxx;k++)
{
if(k>=j)
dp[i][k]=min(dp[i][k],dp[i-1][j]+(k-j)*zhao+k*yue);
else
dp[i][k]=min(dp[i][k],dp[i-1][j]+(j-k)*gong+k*yue);
}
}
int los=11111111;
for(i=used[n];i<=maxx;i++)
los=min(los,dp[n][i]);
printf("%d\n",los);
}
return 0;
}