二维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 */