hdu 6024
阿新 • • 發佈:2017-06-06
cout amp () mem std truct memset style 其中
題意:輸入n,代表n個教室,然後輸入每個教室的坐標和建立糖果屋的代價,如果不建立,則代價為和左邊第一個糖果屋的距離,第一個教室必須為糖果屋,求最小代價
思路:DP,dp1[i]表示當前我建立的最小值,dp2[i]表示我不建立的最小值.那麽dp1[i]=min(dp1[i-1],dp2[i-1])+代價,dp2[i]為dp1[j]+(i與j的距離),其中j與i之間的教室與j的距離也要算入.
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 ll dp1[3002]; 5 ll dp2[3002]; 6 struct node{ 7 ll a,b; 8 }x[3004]; 9 ll c[3002]; 10 11 bool cmp(node p,node q){ 12 return p.a<q.a; 13 } 14 int main(){ 15 int n; 16 ll s,ss; 17 ll Min; 18 while(scanf("%d",&n)!=EOF) 19 { 20 memset(dp1,0,sizeof(dp1)); 21 memset(dp2,0,sizeof(dp2)); 22 for(int i=1;i<=n;i++) { 23 scanf("%I64d%I64d",&x[i].a,&x[i].b); 24 } 25 sort(x+1,x+1+n,cmp); 26 c[0]=0; 27 int k; 28 for(int i=1;i<=n;i++) c[i]=c[i-1]+x[i].a; 29 dp1[1]=x[1].b;//建立 30 dp2[1]=x[1].b;//不建立 31 for(int i=2;i<=n;i++){ 32 dp1[i]=min(dp1[i-1],dp2[i-1])+x[i].b; 33 dp2[i]=dp1[i-1]+x[i].a-x[i-1].a; 34 ss=x[i].a-x[i-1].a; 35 k=1; 36 for(int j=i-2;j>=1;j--){ 37 ss+=(x[j+1].a-x[j].a)*(++k); 38 dp2[i]=min(dp2[i],dp1[j]+ss); 39 } 40 // cout<<dp1[i]<<" "<<dp2[i]<<endl; 41 } 42 cout<<min(dp1[n],dp2[n])<<endl; 43 } 44 return 0; 45 }
hdu 6024