很水的一道DP
#include <iostream> #include <cstdio> #include <cstdlib> using namespace std; int a[1010],l,c,n; int dp[1010],cost[1010]; int f(int x){ if(x==0) return 0; else if(x<=10) return -c; else return (x-10)*(x-10); } int main(){ int cas=1; while(~scanf("%d",&n)&&n){ scanf("%d%d",&l,&c); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<1010;i++) dp[i]=1000000000; dp[1]=1,cost[1]=f(l-a[1]); for(int i=2;i<=n;i++){ int sum=0; for(int j=i;j>=1;j--){ sum+=a[j]; if(sum>l) break; if(dp[j-1]+1<dp[i]){ dp[i]=dp[j-1]+1; cost[i]=cost[j-1]+f(l-sum); }else if(dp[j-1]+1==dp[i]){ if(cost[j-1]+f(l-sum)<cost[i]){ cost[i]=cost[j-1]+f(l-sum); } } } //cout<<dp[i]<<" "<<cost[i]<<endl; } if(cas>1) puts(""); printf("Case %d:\n",cas++); printf("Minimum number of lectures: %d\n",dp[n]); printf("Total dissatisfaction index: %d\n",cost[n]); } return 0; }
uva 607 Scheduling Lectures(DP)
原文:http://www.cnblogs.com/wonderzy/p/3541833.html