uva 10271——Chopsticks

逃离我推掉我的手 2022-08-18 11:32 91阅读 0赞

题意:有n只筷子,然后选出来k+8套(一套有三只,分别ABC),一套筷子质量为最小的两只的平方,选出的使得总的质量和最小。

思路:01背包。dp[i][j]表示j套利选出来i套的最优解,每个都有选当前和不选当前两中状态。

code:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. typedef unsigned long long ull;
  5. typedef long double ld;
  6. const int INF=0x3fffffff;
  7. const int inf=-INF;
  8. const int N=1000000;
  9. const int M=6005;
  10. const int mod=1000000007;
  11. const double pi=acos(-1.0);
  12. #define cls(x,c) memset(x,c,sizeof(x))
  13. #define cpy(x,a) memcpy(x,a,sizeof(a))
  14. #define ft(i,s,n) for (int i=s;i<=n;i++)
  15. #define frt(i,s,t) for (int i=s;i>=t;i--)
  16. #define lson l,m,rt<<1
  17. #define rson m+1,r,rt<<1|1
  18. #define lrt rt<<1
  19. #define rrt rt<<1|1
  20. #define middle int m=(r+l)>>1
  21. #define lowbit(x) (x&-x)
  22. #define pii pair<int,int>
  23. #define mk make_pair
  24. #define IN freopen("in.txt","r",stdin);
  25. #define OUT freopen("out.txt","w",stdout);
  26. int n,k,T;
  27. int v[M],dp[M][M];
  28. int main()
  29. {
  30. scanf("%d",&T);
  31. ft(ca,1,T){
  32. scanf("%d %d",&k,&n);k+=8;
  33. frt(i,n-1,0) scanf("%d",&v[i]);
  34. ft(i,1,k) ft(j,0,n){
  35. dp[i][j]=0;
  36. if (i*3>j){dp[i][j]=9999999;continue;}
  37. dp[i][j]=min(dp[i][j-1],dp[i-1][j-2]+(v[j-1]-v[j-2])*(v[j-1]-v[j-2]));
  38. }
  39. printf("%d\n",dp[k][n]);
  40. }
  41. }

发表评论

表情:
评论列表 (有 0 条评论,91人围观)

还没有评论,来说两句吧...

相关阅读

    相关 UVA Intervals

    UVA Intervals Description 有n个区间,在区间\[ai,bi\]中至少取任意互不相同的ci个整数。求在满足n个区间的情况下,至少要取多