状态多了一维的区间规划....注意处理好每一步的耗能
#include<iostream> #include<string> #include<cstring> #include<algorithm> using namespace std; int n; int f[2005][2005][3]; int sum[2000006]; int stdx[10000]; int a[1000000]; int x[2005][2005]; int s[2005][2005]; int main() { int n,st; cin>>n>>st; for(int i=1;i<=n;i++) { cin>>stdx[i]>>a[i]; a[i]+=a[i-1]; } for(int i=1;i<=n;i++) for(int u=i;u<=n;u++) x[i][u]=a[n]-a[u]+a[i-1]; memset(f,10,sizeof(f)); f[st][st][0]=0; f[st][st][1]=0; for(int p=2;p<=n;p++) for(int i=1;i<=n;i++) { int j=i+p-1; if(j>n)break; f[i][j][0]=min(f[i+1][j][0]+(stdx[i+1]-stdx[i])*x[i+1][j],f[i+1][j][1]+(stdx[j]-stdx[i])*x[i+1][j]); f[i][j][1]=min(f[i][j-1][0]+(stdx[j]-stdx[i])*x[i][j-1],f[i][j-1][1]+(stdx[j]-stdx[j-1])*x[i][j-1]); } int maxx; maxx=min(f[1][n][0],f[1][n][1]); cout<<maxx<<endl; }
时间: 2024-10-20 09:51:15