Input
Output
Example
input | output |
---|---|
4 1
5 0 6
5 3
5
|
14
3
|
思路:先预处理出g[i][j]:表示在边j-1,j上放个洗脑机器时,从去区间[i,j)中出发经过边j-1,j的被洗脑人数。
dp[i][j]表示前i个点中放了j个洗脑机器,并且边i-1,i上放了洗脑机器时最大的洗脑人数。
1 #include <bits/stdc++.h>
2
3 using namespace std;
4
5 #define MP make_pair
6 #define PB push_back
7 typedef long long LL;
8 typedef pair<int,int> PII;
9 const double eps=1e-8;
10 const double pi=acos(-1.0);
11 const int K=1e6+7;
12 const int mod=1e9+7;
13
14
15 int n,s,mx,ls,dp[600][600],g[600][600],sum[600][600],rd[600][600];
16 void ptf(int x,int k)
17 {
18 if(k>0)
19 ptf(rd[x][k],k-1),printf("%d ",x-1);
20 }
21 int main(void)
22 {
23 cin>>n>>s;
24 for(int i=1;i<=n;i++)
25 for(int j=i+1,x;j<=n;j++)
26 scanf("%d",&g[i][j]),g[i][j]+=g[i][j-1];
27 for(int i=1;i<n;i++)
28 for(int j=i+1;j<=n;j++)
29 for(int k=i;k<j;k++)
30 sum[i][j]+=g[k][n]-g[k][j-1];
31 memset(dp,-1,sizeof(dp));
32 dp[1][0]=0,mx=-1;
33 for(int i=1;i<=n;i++)
34 for(int j=1;j<=s;j++)
35 for(int k=j;k<i;k++)
36 if(dp[k][j-1]+sum[k][i]>dp[i][j])
37 dp[i][j]=dp[k][j-1]+sum[k][i],rd[i][j]=k;
38 for(int i=s;i<=n;i++)
39 if(dp[i][s]>mx)
40 {
41 mx=dp[i][s],ls=i;
42 }
43 printf("%d\n",mx);
44 ptf(ls,s);
45 return 0;
46 }
URAL - 1900 Brainwashing Device
原文:http://www.cnblogs.com/weeping/p/6383745.html