标签:
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 5 using namespace std; 6 7 const int inf=0x3f3f3f3f; 8 const int maxn=14; 9 10 int dp[maxn][10000]; 11 int num[maxn]; 12 13 int main() 14 { 15 int n; 16 while(cin>>n) 17 { 18 if(!n) 19 break; 20 21 int fire,sal,hire; 22 23 cin>>hire>>sal>>fire; 24 25 //int min_num=inf; //不必要的 26 int max_num=-inf; 27 28 for(int i=1;i<=n;i++) 29 { 30 cin>>num[i]; 31 32 33 //因为有了这一步if的判断, 34 //判断成功的话,导致下面的else没有执行 35 //这样最后求的max_num是不对的 36 //max_num在后面要用到 37 //所以就wa了 38 //这也说明了,以后同时求min,max的时候 39 //要写成2个if 40 //而不能用 if else 41 42 43 /*if(num[i]<min_num) 44 min_num=num[i]; */ 45 46 /*else*/ if(num[i]>max_num) 47 max_num=num[i]; 48 } 49 50 dp[0][0]=0; 51 52 for(int j=0;j<=max_num;j++) 53 dp[0][j]=j*hire; 54 55 for(int i=1;i<=n;i++) 56 for(int j=0;j<=max_num;j++) 57 dp[i][j]=inf; 58 59 for(int i=1;i<=n;i++) 60 { 61 for(int j=num[i];j<=max_num;j++) 62 { 63 for(int k=num[i-1];k<=j;k++) 64 { 65 dp[i][j]=min(dp[i][j],dp[i-1][k]+(j-k)*hire+j*sal); 66 } 67 for(int k=j+1;k<=max_num;k++) 68 { 69 dp[i][j]=min(dp[i][j],dp[i-1][k]+(k-j)*fire+j*sal); 70 } 71 } 72 } 73 74 int ans=inf; 75 76 for(int j=num[n];j<=max_num;j++) 77 if(dp[n][j]<ans) 78 ans=dp[n][j]; 79 80 cout<<ans<<endl; 81 82 } 83 return 0; 84 }
HDU1158 Employment Planning 基础DP
标签:
原文地址:http://www.cnblogs.com/-maybe/p/4449138.html