1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <algorithm> 6 #include <iomanip> 7 #define ll long long 8 9 using namespace std; 10 11 const int maxn=1005; 12 double dp[maxn][maxn][2]; //值代表的含义 拿到的价值 减去损失的价值 最终为拿到全部的总价值-损失的价值 13 int sum[maxn]; 14 int n,m; 15 const int INF=-0x3f3f3f3f; 16 17 struct Node{ 18 int x,y,v; 19 bool operator<(const Node&X) const{ 20 return x<X.x; 21 } 22 }A[maxn]; 23 24 int main(){ 25 ios::sync_with_stdio(false); 26 memset(dp,INF,sizeof(dp)); 27 cin>>n>>m; 28 for(int i=1;i<=n;i++) cin>>A[i].x; 29 for(int i=1;i<=n;i++) cin>>A[i].y; 30 for(int i=1;i<=n;i++) cin>>A[i].v; 31 32 sort(A+1,A+1+n); 33 for(int i=1;i<=n;i++) sum[i]=sum[i-1]+A[i].v; 34 for(int i=1;i<=n;i++){ 35 dp[i][i][0]=A[i].y-abs(A[i].x-m)*sum[n]; 36 dp[i][i][1]=A[i].y-abs(A[i].x-m)*sum[n]; 37 } 38 for(int len=2;len<=n;len++){ 39 for(int i=1;i+len-1<=n;i++){ 40 int j=i+len-1; 41 dp[i][j][0]=max((dp[i+1][j][0]+A[i].y-(A[i+1].x-A[i].x)*(sum[n]-sum[j]+sum[i])),dp[i+1][j][1]+A[i].y-(A[j].x-A[i].x)*(sum[n]-sum[j]+sum[i])); 42 dp[i][j][1]=max((dp[i][j-1][0]+A[j].y-(A[j].x-A[i].x)*(sum[n]-sum[j-1]+sum[i-1])),dp[i][j-1][1]+A[j].y-(A[j].x-A[j-1].x)*(sum[n]-sum[j-1]+sum[i-1])); 43 } 44 } 45 cout << fixed << setprecision(3) << max(dp[1][n][0],dp[1][n][1])/1000.0 << endl; 46 return 0; 47 48 }
原文:https://www.cnblogs.com/qq-1585047819/p/11806830.html