SPOJ 423 Assignments 状态DP
2024-10-08 17:54:30
这个题目搁置了这么久,终于搞完了。
给n个人分配n个课程,已经告诉了你n个人对哪几门感兴趣,问最多有多少种分配方式
我刚开始都没找到这怎么还可以状态dp,哪来的状态转移,想用暴力DFS,果断TLE的妥妥的。
后来给殷犇发了这个题目,他还说你刷个这水题还刷得这包子劲,这题目就是后一行的状态由前一行得到,枚举当前这一行分配的状态,如果可行,就从后面的状态加过来
由于状态只是从上一行转移过来,所以可以用滚动数组,用p表示当前,则!p就为上一行的,每次结束再把p置反即可。
#include <iostream>
#include <cstdio>
#include <cstring>
#define ll long long
using namespace std;
int n;
int sta[];
ll dp[][<<];
int calc[][<<],cnt[];
void init()
{
memset(calc,,sizeof calc);
memset(cnt,,sizeof cnt);
for (int i=;i<(<<);i++) //这里把只有一门课 两门。。。N门课全部用一个数组存起来,calc[i][]就代表有i个课程的状态,因为不止一种 所以开了两维。
{
int tmp=;
for (int j=i;j;j>>=)
{
if (j&)
tmp++;
}
calc[tmp][cnt[tmp]++]=i;
}
}
int main()
{
int t,a;
scanf("%d",&t);
init();
while (t--)
{
scanf("%d",&n);
for (int i=;i<n;i++)
{
sta[i]=;
for (int j=;j<n;j++)
{
scanf("%d",&a);
if (a==)
{
sta[i]+=<<j;//存入学生感兴趣的课程的状态。
}
}
} int p=,all=(<<n)-;
//memset(dp,0,sizeof dp);
dp[][]=;
for (int i=;i<n;i++)//从第0个人循环到第n-1个人
{
for (int k=,s=calc[i+][k];k<cnt[i+]&&calc[i+][k]<=all;s=calc[i+][++k])//当前是第i号人 则状态必定是calc[i+1][]的状态,比如第三个人就只分配三个课程即可,一旦可行 就从分配了两个课程的状态那里转移过来。
{
dp[p][s]=;
for (int j=;j<n;j++)//逐个试探第j号课程是否可以
{
//dp[p][k]=0;
if (((<<j)&sta[i])==) continue;
if ((<<j)&s)
{
//dp[p][k]+=1; dp[p][s]+=dp[p^][(<<j)^s];//一旦该状态可以,则从上一次的不含新分配的课程的那里转移过来
} //else
// dp[p][k]+=dp[p^1][k];
}
}
p^=;
}
printf("%lld\n",dp[p^][all]);
}
return ;
}
最新文章
- Alpha版本十天冲刺——Day 2
- 60行JS实现俄罗斯方块
- Java基础之一组有用的类——使用比较器对数组排序(TrySortingWithComparator)
- ContentProvider官方教程(8)自定义MIME
- ALV详解:Function ALV(二)
- Redis入门(优势,环境,字符串,哈希,列表)
- oracle时间处理
- codeforces 340A The Wall(简单数学题)
- mybatis UpdateByExampleMapper UpdateByExampleSelectiveMapper
- html multiple select option 分组
- 转:LESS CSS 框架简介
- 一个使用CSocket类的网络通信实例
- WCF创建到使用到发布
- TimeJob权限问题 拒绝访问
- Bootstrap--下拉菜单.dropdown
- myeclipse编码
- word20170103除了busy,忙的10种英语说法!
- B - 取(2堆)石子游戏
- [vue]webpack使用样式
- oracle 工作笔记,不定期更新
热门文章
- Ruoyi的确不错,不知后续能否坚持 允许商用
- Django(七)模型:字段属性、字段选项(参数)
- 08 SSM整合案例(企业权限管理系统):09.用户和角色操作
- created a ThreadLocal with key of type [oracle.jdbc.driver.AutoKeyInfo$1]
- POJ 3321:Apple Tree 树状数组
- 微信公众号开发之根据OpenID列表群发(十四)
- Oracle-SQL 小题
- maven手动安装ojdbc6.jar包到本地仓库
- Django 模板渲染
- Codeforces 459C Pashmak and Buses 机智数学题