题意:
略。
思路:
【区间DP】同hdu1227
Mark:比赛的时候直接 没有读懂题意啊!!!最近怎么老是读不懂题意了?
1 #include<stdio.h> 2 #include<math.h> 3 #include<string.h> 4 #include<algorithm> 5 #define inf 1000000000 6 7 #define N 1111 8 9 using namespace std; 10 11 struct data{ 12 int pos; 13 double p; 14 }seq[N]; 15 int nn; 16 int n,m; 17 18 int find(int pos) 19 { 20 for (int i=1;i<=nn;i++) 21 if (seq[i].pos == pos) 22 return i; 23 // printf("%d\n",pos); 24 ++nn; 25 seq[nn].pos = pos; 26 seq[nn].p = 0.0; 27 return nn; 28 } 29 bool cmp(data x, data y){ 30 return x.pos < y.pos; 31 } 32 double cost[N][N]; 33 double dp[N][N]; 34 double get(int l,int r) 35 { 36 double res = 0.0; 37 for (int k=l;k<=r;k++) 38 res += min(seq[k].pos - seq[l].pos,seq[r].pos - seq[k].pos) * seq[k].p; 39 return res; 40 } 41 int main() 42 { 43 while (scanf("%d%d",&n,&m)==2){ 44 if (n==0 && m==0) 45 break; 46 47 nn = 0; 48 for (int i=1;i<=n;i++) 49 { 50 int t; 51 scanf("%d",&t); 52 for (int j=1;j<=t;j++) 53 { 54 int pos; 55 double p; 56 scanf("%d%lf",&pos,&p); 57 int tmp = find(pos); 58 seq[tmp].p += p; 59 } 60 } 61 62 // for (int i=1;i<=nn;i++) 63 // printf("%d %lf\n",seq[i].pos,seq[i].p); 64 sort(seq+1,seq+1+nn,cmp); 65 66 67 seq[0].pos = -inf; 68 seq[0].p = 0.0; 69 seq[nn+1].pos = inf; 70 seq[nn+1].p = 0.0; 71 for (int i=0;i<=nn+1;i++) 72 for (int j=i;j<=nn+1;j++){ 73 cost[i][j] = get(i,j); 74 // printf("%d %d %lf\n",i,j,cost[i][j]); 75 } 76 for (int i=1;i<=nn;i++) 77 for (int j=1;j<=nn;j++){ 78 dp[i][j] = inf; 79 } 80 for (int i=1;i<=nn;i++) 81 { 82 dp[i][1] = cost[0][i]; 83 for (int j=2;j<=min(i,m);j++){ 84 for (int k=1;k<i;k++) 85 if (dp[k][j-1] + cost[k][i] < dp[i][j]) 86 dp[i][j] = dp[k][j-1] + cost[k][i]; 87 } 88 } 89 double ans = inf; 90 for (int i=1;i<=nn;i++) 91 { 92 if (dp[i][min(i,m)] + cost[i][nn+1] < ans) 93 ans = dp[i][min(i,m)] + cost[i][nn+1]; 94 } 95 printf("%.2lf\n",ans); 96 } 97 return 0; 98 }