HDU4526威威猫系列故事——拼车记(DP)
http://acm.hdu.edu.cn/showproblem.php?pid=4526
额。。七夕快乐哦
刚推的时候有点乱 又各种小错误 查了好久。。
dp[i][k] = min(dp[i-1][g]+g*t+d,dp[i][k]){(g-k)<=res[i]} 第i辆车时 剩余K个人
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 using namespace std; 7 #define INF 0xfffffff 8 int ca[111][2],dp[110][110]; 9 int main() 10 { 11 int t,g,i,j,k,n,s,d; 12 cin>>t; 13 while(t--) 14 { 15 cin>>n>>k>>d>>s; 16 memset(ca,0,sizeof(ca)); 17 for(i = 1; i <= k ;i++) 18 scanf("%d%d",&ca[i][0],&ca[i][1]); 19 for(i = 1 ; i <= k ; i++) 20 for(j = 0 ; j <= n ;j++) 21 dp[i][j] = INF; 22 if(n==0) 23 { 24 printf("0\n"); 25 continue; 26 } 27 if(ca[1][1]>=n) 28 { 29 cout<<d+ca[1][0]*n<<endl; 30 continue; 31 } 32 for(i = n-ca[1][1] ; i < n ; i++) 33 dp[1][i] = n*ca[1][0]+d; 34 dp[1][n] = n*ca[1][0]; 35 for(i = 2; i <= k ;i++) 36 { 37 for(j = 0; j <= n ; j++) 38 { 39 dp[i][j] = dp[i-1][j]+j*(ca[i][0]-ca[i-1][0]); 40 for(g = j+1 ; g <= j+ca[i][1]&&g <= n ;g++) 41 dp[i][j] = min(dp[i][j],dp[i-1][g]+g*(ca[i][0]-ca[i-1][0])+d); 42 } 43 } 44 if(dp[k][0]==INF) 45 puts("impossible"); 46 else 47 cout<<dp[k][0]<<endl; 48 } 49 return 0; 50 }