这个题目搁置了这么久,终于搞完了。

给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 ;
}

最新文章

  1. Alpha版本十天冲刺——Day 2
  2. 60行JS实现俄罗斯方块
  3. Java基础之一组有用的类——使用比较器对数组排序(TrySortingWithComparator)
  4. ContentProvider官方教程(8)自定义MIME
  5. ALV详解:Function ALV(二)
  6. Redis入门(优势,环境,字符串,哈希,列表)
  7. oracle时间处理
  8. codeforces 340A The Wall(简单数学题)
  9. mybatis UpdateByExampleMapper UpdateByExampleSelectiveMapper
  10. html multiple select option 分组
  11. 转:LESS CSS 框架简介
  12. 一个使用CSocket类的网络通信实例
  13. WCF创建到使用到发布
  14. TimeJob权限问题 拒绝访问
  15. Bootstrap--下拉菜单.dropdown
  16. myeclipse编码
  17. word20170103除了busy,忙的10种英语说法!
  18. B - 取(2堆)石子游戏
  19. [vue]webpack使用样式
  20. oracle 工作笔记,不定期更新

热门文章

  1. Ruoyi的确不错,不知后续能否坚持 允许商用
  2. Django(七)模型:字段属性、字段选项(参数)
  3. 08 SSM整合案例(企业权限管理系统):09.用户和角色操作
  4. created a ThreadLocal with key of type [oracle.jdbc.driver.AutoKeyInfo$1]
  5. POJ 3321:Apple Tree 树状数组
  6. 微信公众号开发之根据OpenID列表群发(十四)
  7. Oracle-SQL 小题
  8. maven手动安装ojdbc6.jar包到本地仓库
  9. Django 模板渲染
  10. Codeforces 459C Pashmak and Buses 机智数学题