搬寝室(经典dp)

分析:设 dp[i][j]为在前 j 件物品中选择 i 对物品时最小的疲劳度

          为使疲劳最小,要拿排序后相邻的两数。从小到大依次递推

         (1)当j == 2*i时

    dp[i][j]=dp[i-2][j-1]+(p[i]-p[i-1])*(p[i]-p[i-1])

         (2)当j > 2*i时

       

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 
 7 int list[2001];
 8 int dp[1001][2001];
 9 
10 int main() 
11 {
12     int n,k;
13     while(cin >> n >> k)
14     {
15         for(int i = 1; i <= n; ++i)
16             cin >> list[i];
17         
18         sort(list + 1, list + 1 + n);
19         
20         for(int i = 0; i <= n; ++i)
21             dp[0][i] = 0;
22         
23         for(int i = 1; i <= k; ++i)
24             for(int j = 2 * i; j <= n; ++j)
25                 if(j == 2 * i)
26                     dp[i][j] = dp[i-1][j-2] + (list[j]-list[j-1]) * (list[j]-list[j-1]);
27                 else
28                     dp[i][j] = min(dp[i][j-1], dp[i-1][j-2] + (list[j]-list[j-1]) * (list[j]-list[j-1]));
29          
30         cout << dp[k][n] << endl;
31     }
32             
33     return 0;
34 }

转载于:https://www.cnblogs.com/FengZeng666/p/11106663.html

猜你喜欢

转载自blog.csdn.net/weixin_34337265/article/details/94291426