f[i][j]代表前 i 个机器人,当前高度为j的最小值
因为比如下降的时候是由f[i-1][1~j]转过来的
所以f[i][j]强行记录分f[i-1][1~j]的最小值
然后转移一下
我这次因为unique返回没有减1所以掉了20分,引以为戒
code:
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 using namespace std; 6 int f[50050][1500],p[50050]; 7 int min0=0x3f3f3f3f; 8 int read(){ 9 int x=0,f=1; 10 char c=getchar(); 11 while(!isdigit(c)){ 12 if(c=='-')f=-1; 13 c=getchar(); 14 } 15 while(isdigit(c)){ 16 x=(x<<3)+(x<<1)+c-'0'; 17 c=getchar(); 18 } 19 return x*f; 20 } 21 int main(){ 22 //freopen("robot.in","r",stdin); 23 //freopen("robot.out","w",stdout); 24 int n,m1,m2; 25 n=read(),m1=read(),m2=read(); 26 int d[50006],cnt=0; 27 for(int i=1;i<=n;i++){ 28 p[i]=read(); 29 d[i]=p[i]; 30 } 31 sort(d+1,d+n+1); 32 int k=unique(d+1,d+n+1)-d-1; 33 for(int i=1;i<=n;i++){ 34 p[i]=lower_bound(d+1,d+k+1,p[i])-d; 35 } 36 memset(f,0x3f3f3f3f,sizeof f); 37 f[0][1]=0; 38 for(int i=1;i<=n;i++){ 39 for(int j=1;j<=k;j++){ 40 int val=0; 41 if(j>p[i])val=m1; 42 if(j<p[i])val=m2; 43 f[i][j]=f[i-1][j]+val; 44 f[i][j]=min(f[i][j-1],f[i][j]); 45 } 46 } 47 min0=f[n][k]; 48 memset(f,0x3f3f3f3f,sizeof f); 49 f[0][k]=0; 50 for(int i=1;i<=n;i++){ 51 for(int j=k;j>=1;j--){ 52 int val=0; 53 if(j>p[i])val=m1; 54 if(j<p[i])val=m2; 55 f[i][j]=f[i-1][j]+val; 56 f[i][j]=min(f[i][j],f[i][j+1]); 57 } 58 } 59 cout<<min(min0,f[n][1]); 60 return 0; 61 } 62 /* 63 20 3 4 64 5 9 8 7 4 6 8 7 1 3 2 4 8 7 5 9 6 8 7 4 65 66 40 67 */
over