标签:mem #define size amp include put space for tput
Input
每组输入数据有两行,第一行有两个数n,k(2<=2*k<=n<2000).第二行有n个整数分别表示n件物品的重量(重量是一个小于2^15的正整数).Output对应每组输入数据,输出数据只有一个表示他的最少的疲劳度,每个一行.Sample Input
2 1 1 3
Sample Output
4
分析
先排序,要选择两个成一对的话一定是选邻近的。定义dp[i][j]为i个物体选了j对,其中i>=2*j。
dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+a[i-1]);即选择i-1和i成一对或者不选。
#include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<algorithm> #include<cstring> #include <queue> #include <vector> #include<bitset> #include<map> #include<deque> using namespace std; typedef long long LL; const int maxn = 1e4+5; const int mod = 77200211+233; typedef pair<int,int> pii; #define X first #define Y second #define pb push_back //#define mp make_pair #define ms(a,b) memset(a,b,sizeof(a)) const int inf = 0x3f3f3f3f; #define lson l,m,2*rt #define rson m+1,r,2*rt+1 typedef long long ll; #define N 100010 int dp[2020][2020]; int a[2020]; int main(){ int n,k; while(~scanf("%d%d",&n,&k)){ for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+1+n); for(int i=1;i<n;i++){ a[i]-=a[i+1]; a[i]*=a[i]; } ms(dp,0); for(int i=1;i<=n;i++){ for(int j=1;j<=k;j++){ if(2*j>i) dp[i][j]=inf; else dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+a[i-1]); } } cout<<dp[n][k]<<endl; } return 0; }
标签:mem #define size amp include put space for tput
原文地址:https://www.cnblogs.com/fht-litost/p/8858059.html