牛牛的计算机内存(状压DP)

链接:https://ac.nowcoder.com/acm/problem/21873

来源:牛客网

题目描述

牛牛的计算机一共有m块内存,现在有n条指令,每条指令是一个01序列
如果指令的第i个字符为1,说明这条指令需要访问第i块内存
每条指令的执行代价为k^2, k为新访问内存的数量,即之前的指令都没有访问到的内存数量
你可以随意安排n条指令的执行顺序,求执行完所有指令的最小代价

输入描述:

第一行先输入一个整数n (1n201≤n≤20)
接下来每行输入一个01字符串,长度不超过20

输出描述:

输出一个整数

具体思路:

dp[i]表示i所对应的二进制中选了哪几行的最小花费。

val[i]表示i所对应的二进制中选了哪几行对应的访问了哪些内存

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 # define ll long long
 4 # define inf 0x3f3f3f3f
 5 const int mod = 1e9+7;
 6 const int maxn = 2e6+100;
 7 int dp[maxn],val[maxn];
 8 int n,m;
 9 int cal(char str[])
10 {
11     int len=strlen(str);
12     int tmp=1;
13     int ans=0;
14     for(int i=len-1; i>=0; i--)
15     {
16         ans+=(str[i]-'0')*tmp;
17         tmp<<=1;
18     }
19     return ans;
20 }
21 char str[25];
22 int f(int t1,int t2)
23 {
24     int ans=0;
25     for(int i=0; i<=20; i++)
26     {
27         if(((t1&(1<<i))==0)&&(t2&(1<<i)))
28             ans++;
29     }
30     return ans*ans;
31 }
32 int a[maxn];
33 int main()
34 {
35     memset(dp,inf,sizeof(dp));
36     dp[0]=0;
37     scanf("%d %d",&n,&m);
38     for(int i=0; i<n; i++)
39     {
40         scanf("%s",str);
41         a[i]=cal(str);// 因为比较的时候是按照十进制比较的,所以先转换成二进制
42     }
43     int maxstate=(1<<n)-1;
44     for(int i=0; i<=maxstate; i++)
45     {
46         for(int j=0; j<n; j++)
47         {
48             if(i&(1<<j))
49                 continue;
50             if(dp[i]==inf)
51                 continue;
52             int tmp=dp[i]+f(val[i],a[j]);
53             if(dp[i|(1<<j)]>tmp)
54             {
55                 dp[i|(1<<j)]=tmp;
56                 val[i|(1<<j)]=val[i]|a[j];
57             }
58         }
59     }
60     printf("%d\n",dp[maxstate]);
61     return 0;
62 }

 

转载于:https://www.cnblogs.com/letlifestop/p/10983535.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的公寓报修管理系统,源码+数据库+毕业论文+视频演示 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本公寓报修管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此公寓报修管理系统利用当下成熟完善的Spring Boot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。公寓报修管理系统有管理员,住户,维修人员。管理员可以管理住户信息和维修人员信息,可以审核维修人员的请假信息,住户可以申请维修,可以对维修结果评价,维修人员负责住户提交的维修信息,也可以请假。公寓报修管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 关键词:公寓报修管理系统;Spring Boot框架;MySQL;自动化;VUE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值