DP。
槽点满满的题。
1.没有告知人数的范围,导致一开始就想到的dp不敢写。
2.存在人数为0的月份,坑了我好久。
dp[i][j]表示第i个月的工程完工时,有j个人的情况下的最小费用。
#include<stdio.h> #include<string.h> #include<string> #include<iostream> #include<map> #include<algorithm> using namespace std; const int INF=0x7FFFFFFF; int dp[15][1200]; int num[15],n; int c1,c2,c3; int main() { while(~scanf("%d",&n)) { if(n==0) break; for(int i=1;i<=n;i++) for(int j=0;j<=1100;j++) dp[i][j]=INF; scanf("%d%d%d",&c1,&c2,&c3); int top=0; for(int i=1;i<=n;i++) { scanf("%d",&num[i]); top=max(top,num[i]); } dp[1][num[1]]=(c1+c2)*num[1]; for(int i=2;i<=n;i++) { for(int j=num[i];j<=top;j++) { for(int k=0;k<=top;k++) { if(dp[i-1][k]==INF) continue; if(k<j) dp[i][j]=min(dp[i][j],dp[i-1][k]+(j-k)*c1+j*c2); else if(k>=j) dp[i][j]=min(dp[i][j],dp[i-1][k]+(k-j)*c3+j*c2); } } } int ans=INF; for(int i=0;i<=top;i++) ans=min(dp[n][i],ans); printf("%d ",ans); } return 0; }