10.20T2 DP

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

原文地址:https://www.cnblogs.com/saionjisekai/p/9821725.html