EOJ:The Baric Bovine
The Baric Bovine
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submits: 76 | Accepted: 17 |
Description
Following up on a journal article about increasing milk production, Bessie has become the Baric Bovine by studying atmospheric pressure in order to curry favor with Farmer John.
She takes N (1 <= N <= 100) measurements conveniently named M_1 through M_N during the day (1 <= M_i <= 1,000,000); these measurements are numbered in the order in which Bessie observed them.
In order to characterize the day's atmospheric pressure readings, she is interested in finding a subset of the measurements (given by the K (1 <= K <= N) indices s_j where 1 <= s_1 < s_2 < ... < s_K <= N) that accurately reflects the entire set, i.e., limits the error as described below.
In any subset of measurements, an error is incurred for each measurement (1) before the first member of the subset, (2) between two consecutive measurements in the subset, and (3) after the last member of the subset. The total error value for a given set of s_j values is the sum of each of the individual errors.
Specifically, for all measurements whose index i is not one of the s_j values:
* if i is less than s_1, then the sample error is: 2 * | M_i - M_(s_1) |
* if i is between s_j and s_(j+1), then the sample error is | 2 * M_i - Sum(s_j, s_(j+1)) | where Sum(x, y) = M_x + M_y;
* if i is greater than s_K, then the sample error is 2 * | M_i - M_(s_K) |
Given a maximum error value E (1 <= E <= 1,000,000), determine the size of the smallest subset of measurements that produces an error of at most E.
She takes N (1 <= N <= 100) measurements conveniently named M_1 through M_N during the day (1 <= M_i <= 1,000,000); these measurements are numbered in the order in which Bessie observed them.
In order to characterize the day's atmospheric pressure readings, she is interested in finding a subset of the measurements (given by the K (1 <= K <= N) indices s_j where 1 <= s_1 < s_2 < ... < s_K <= N) that accurately reflects the entire set, i.e., limits the error as described below.
In any subset of measurements, an error is incurred for each measurement (1) before the first member of the subset, (2) between two consecutive measurements in the subset, and (3) after the last member of the subset. The total error value for a given set of s_j values is the sum of each of the individual errors.
Specifically, for all measurements whose index i is not one of the s_j values:
* if i is less than s_1, then the sample error is: 2 * | M_i - M_(s_1) |
* if i is between s_j and s_(j+1), then the sample error is | 2 * M_i - Sum(s_j, s_(j+1)) | where Sum(x, y) = M_x + M_y;
* if i is greater than s_K, then the sample error is 2 * | M_i - M_(s_K) |
Given a maximum error value E (1 <= E <= 1,000,000), determine the size of the smallest subset of measurements that produces an error of at most E.
Input
* Line 1: Two space-separated integers: N and E
* Lines 2..N+1: Line i+1 contains a single integer: M_i
* Lines 2..N+1: Line i+1 contains a single integer: M_i
Output
* Line 1: Two space-separated integers: the size of the smallest subset of measurements that produces an error of at most E and the least possible error for the subset of that size.
Sample Input
4 201032040
Sample Output
2 17
Hint
Choosing the second and fourth measurements is the best option, giving an error of 17. The first term's error is 2*|10-3| = 14; the third term's error is |2*20 - (3+40)| = 3.
__________________________________________________________________________________________________
题解:
动归,主要是有个预处理
DP[I][J]表示取了I个数,且所取的最后一个数为第J个数时的最小ERROR
dp[i][j]=min(dp[i][j],dp[i-1][k]-error[k][k]+error[k][j])(i<=j<=n,i-1<-k<j)
Error为预处理的数组,ERROR[I][J]表示以I,J为所取的最后两个数,从I到N中所有不在序列中数的ERROR之和。
代码
1 #include<stdio.h>
2 #include<math.h>
3 #define oo 1000000000;
4 long long dp[102][102],error[102][102],m[102];
5 int i,j,k,loc,ans,e,n,e;
6 int min(int a,int b)
7 {
8 return a>b?b:a;
9 }
10 int main()
11 {
12 scanf("%d%d",&n,&e);
13 for (i=1;i<=n;i++)
14 scanf("%d",&m[i]);
15 for (i=1;i<=n;i++)
16 for (j=i;j<=n;j++)
17 for (k=i+1;k<=n;k++)
18 {
19 if (k>j) error[i][j]+=2*abs(m[j]-m[k]);
20 if (k<i) error[i][j]+=2*abs(m[i]-m[k]);
21 if (k>i&&k<j) error[i][j]+=abs(2*m[k]-m[i]-m[j]);
22 }
23 for (i=1;i<=n;i++)
24 for (j=1;j<=n;j++)
25 dp[i][j]=oo;
26 for (i=1;i<=n;i++)
27 {
28 dp[1][i]=0;
29 for (j=1;j<=n;j++)
30 dp[1][i]+=2*abs(m[i]-m[j]);
31 }
32 for (i=2;i<=n;i++)
33 for (j=i;j<=n;j++)
34 for (k=i-1;k<j;k++)
35 dp[i][j]=min(dp[i][j],dp[i-1][k]-error[k][k]+error[k][j]);
36 for (i=1;i<=n;i++)
37 {
38 ans=oo;
39 for (j=i;j<=n;j++)
40 if (dp[i][j]<ans)
41 {
42 loc=i;
43 ans=dp[i][j];
44 }
45 if (ans<=e) break;
46 }
47 printf("%d %d\n",loc,ans);
48 return 0;
49 }