HDU 5691 Sitting in Line

本文介绍了一种使用状态压缩动态规划解决特定问题的方法。通过状态压缩,可以高效地处理涉及组合和选择的问题。代码示例展示了如何初始化状态并迭代更新最大价值。

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

状态压缩DP。

dp[i][j]表示前cnt个位置放了i状态的那些数字,cnt位置放的是j这个数字的最大价值。其中cnt为i二进制中1的个数。

#include<cstdio>
#include <iostream>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;

long long INF = 99999999999999999;
long long dp[70000][20];
int n;
long long a[20];
int p[20],f[20], g[20];

int main()
{
    int T; int Case = 1;
    scanf("%d", &T);
    while (T--)
    {
        scanf("%d", &n);
        memset(f, 0, sizeof f); memset(g, 0, sizeof g);
        for (int i = 1; i <= n; i++)
        {
            scanf("%lld%d", &a[i], &p[i]);
            if (p[i] == -1) continue; 
            p[i]++;
            f[p[i]] = i;
            g[i] = 1;
        }

        for (int i = 0; i<(1 << n); i++)
            for (int j = 0; j <= n; j++) dp[i][j] = -INF;

        for (int j = 1; j <= n; j++)
        {
            if (g[j] == 1 && p[j] != 1) continue;
            dp[1 << (j - 1)][j] = 0;
        }

        for (int i = 1; i<(1 << n); i++)
        {
            int cnt = 0;
            for (int j = 0; j<n; j++) if ((i&(1 << j)) !=0) cnt++;

            for (int j = 1; j <= n; j++)
            {
                if (dp[i][j] == -INF) continue;
                if (f[cnt + 1] != 0)
                {
                    dp[i | (1 << (f[cnt + 1] - 1))][f[cnt + 1]] = max(dp[i | (1 << (f[cnt + 1] - 1))][f[cnt + 1]],
                        dp[i][j] + a[f[cnt + 1]] * a[j]);
                    continue;
                }
                for (int k = 1; k <= n; k++)
                {
                    if (((1 << (k - 1))&i) != 0) continue;
                    if (g[k] == 1) continue;

                    dp[i | (1 << (k - 1))][k] = max(dp[i | (1 << (k - 1))][k],
                        dp[i][j] + a[k] * a[j]);
                }
            }
        }

        long long ans = -INF;
        for (int j = 1; j <= n; j++)
        {
            ans = max(ans, dp[(1 << n) - 1][j]);
        }
        printf("Case #%d:\n", Case++);
        printf("%lld\n", ans);
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/zufezzt/p/5519087.html

内容概要:本文详细介绍了Rust在系统编程中的应用,包括基础知识、核心技术及开发流程。首先阐述了Rust语言的基础及环境搭建,强调了其强类型系统和现代语法。接着深入探讨了所有权机制与内存安全,指出Rust通过所有权系统确保内存安全,避免悬垂指针和内存泄漏。再者,讲解了Rust的并发编程模型,通过消息传递和无数据竞争的线程模型实现安全并发。此外,讨论了Rust在底层硬件访问与嵌入式开发中的应用,展示了其在资源受限平台上的适应性。随后,介绍了系统调用与内核模块开发,说明了Rust如何调用操作系统底层API并实现与现有内核代码的无缝集成。还提及了性能优化与调试技巧,如使用编译器优化选项和工具链支持。最后,通过实战项目案例解析和社区资源展望,展示了Rust在系统编程领域的潜力和发展前景。; 适合人群:有一定编程基础,尤其是对系统编程感兴趣的开发者,包括操作系统内核开发、驱动程序编写、嵌入式系统开发等领域的工程师。; 使用场景及目标:①学习Rust语言的基础知识和环境搭建,掌握强类型系统和现代语法;②理解所有权机制与内存安全,避免传统系统编程中的常见错误;③掌握并发编程模型,实现安全高效的多线程操作;④了解底层硬件访问和嵌入式开发,适应资源受限平台;⑤掌握系统调用与内核模块开发,实现与现有系统的无缝集成;⑥学习性能优化与调试技巧,提高系统软件的运行效率和稳定性;⑦通过实战项目案例解析,掌握系统编程的实际应用。; 其他说明:Rust作为系统编程的新选择,不仅提升了传统系统软件的安全性,还通过现代语言特性和工具链优化了开发效率。开发者应充分利用Rust的特性,构建更加健壮、高效的系统软件,迎接未来计算机领域的新挑战。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值