zoj 1234 Chopsticks

本文探讨了一段使用C++解决特定组合问题的代码实现,重点在于通过动态规划和优化算法来解决由一系列整数组成的组合问题,具体包括如何通过函数计算不同组合的最优解,以及如何在给定条件下的复杂度优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <bits/stdc++.h>
using namespace std;
#define maxn1 5005
#define maxn2 1100
int d[maxn1][maxn2];
int p(int a)
{
    return a*a;
}
int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int t;scanf("%d",&t);
    while(t--){
        int k,n;
        scanf("%d%d",&k,&n);
        int dd[maxn1];
        for (int i=1;i<=n;i++){
            scanf("%d",&dd[i]);
        }
        sort(dd+1,dd+n+1);
        memset(d,0,sizeof(d));
        d[n-2][1]=p(dd[n-2]-dd[n-1]);
       for (int i=n-3;i>=1;i--){
             for (int is=1;is<=k+8;is++){
                if (n-i+1<3*is) break;
                if (n-i+1==3*is){
                    d[i][is]=d[i+2][is-1]+p(dd[i]-dd[i+1]);
                }
                if (n-i+1>3*is){
                    d[i][is]=min(d[i+1][is],d[i+2][is-1]+p(dd[i]-dd[i+1]));
                }
            }
        }
        printf("%d\n",d[1][k+8]);
    }
    return 0;
}

d[i][k]:由i~n这些数值来组成k组

if(n-i+1<3*k) 无法组成

if (n-i+1==3*k) 正好可以组成 d[i][k]=d[i+2][k-1]+p(dd[i]-dd[i+1])

if(n-i+1>3*k) 可以组成 d[i][k]=min(d[i+1][k],d[i+2][k-1]+p(dd[i]-dd[i+1]))


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值