URAL1900 Brainwashing Device(dp)

1900

二维dp挺好推 dp[i][j] = max(dp[i][j],dp[g][j-1]+o[i][i+1]-o[g][i+1])(i>g>=j-1) dp[i][j]表示第i个站台开放第j次设备 预处理出来通过i-j的人数 包括 i-1~j+1等等的 用o[i][j]表示的

没睡好 %>_<%

因为有可能全部都为0  初始化时dp设为-1.

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 #include<vector>
 7 #include<queue>
 8 using namespace std;
 9 #define LL long long
10 int dp[510][510],q[510];
11 int w[510][510],o[510][510],pa[510][510];
12 int main()
13 {
14     int i,j,n,k;
15     cin>>n>>k;
16     for(i = 1; i < n ;i++)
17     {
18         for(j = 1; j <= n-i ; j++)
19         {
20             int x;
21             cin>>x;
22             w[i][i+j] = x;
23         }
24     }
25     for(i = 1; i <= n ; i++)
26     {
27         for(j = n ; j > i ; j--)
28         o[i][j] = o[i][j+1]+w[i][j]+o[i-1][j]-o[i-1][j+1];
29     }
30     memset(dp,-1,sizeof(dp));
31     for(i = 1; i < n ;i++)
32     dp[i][1] = o[i][i+1];
33     for(j = 2; j <= k ; j++)
34     for(i = j; i < n; i++)
35     {
36         int kk;
37         for(int g = 1 ; g < i ; g++)
38         {
39             if(dp[g][j-1]+o[i][i+1]-o[g][i+1]>dp[i][j])
40             {
41                 dp[i][j] = dp[g][j-1]+o[i][i+1]-o[g][i+1];
42                 kk = g;
43             }
44         }
45         pa[i][j] = kk;
46     }
47     int maxz=-1,x;
48     for(i = k; i < n ; i++)
49     {
50         if(maxz<dp[i][k])
51         {
52             maxz = dp[i][k];
53             x = i;
54         }
55     }
56     cout<<maxz<<endl;
57     int e = 1;
58     q[e] = x;
59     while(k>1)
60     {
61         x = pa[x][k];
62         q[++e] = x;
63         k--;
64     }
65     sort(q+1,q+e+1);
66     for(i = 1; i < e ; i++)
67     cout<<q[i]<<" ";
68     cout<<q[e]<<endl;
69     return 0;
70 }
71 /*
72 5 3
73 5 0 6 5
74 5 3 7
75 5 3
76 10
77 44
78 1 2 4
79 4 2
80 5 0 6
81 5 3
82 5
83 19
84 1 2
85 
86 4 3
87 5 0 6
88 5 3
89 5
90 24
91 1 2 3
92 */
View Code
原文地址:https://www.cnblogs.com/shangyu/p/3543097.html