Description

平行世界是动漫作品中经常涉及的题材,而且往往这些作品都相当的精彩,如《寒蝉鸣泣之时》、《CLANNAD》、《魔法少女小圆》、《命运石之门》等。世界从诞生到结束,最终又轮回到诞生。无论命运如何的绝对,在无数次的轮回中终将被打破,犹如掷骰子,在无限接近于零但不等于零的机率中往复。这样在无限的反复和轮回中,将其可能性放大到100%。最典型的人物就是《海猫鸣泣之时》中的能无限次引发奇迹力量的“奇迹之魔女”贝伦卡斯泰露。而与此对应的是能够让事件发生的可能性无限接近于零“绝对的魔女”拉姆达戴露塔。在故事中,贝伦的目的是为了令主角战人在黄金魔女的游戏中“赢”,而拉姆达的目的则是为了让游戏永远“平局”下去。
由于可以无限的轮回,因此可以将整个黄金魔女的游戏看成一个环,在游戏中有n个关键人物。人物之间存在着胜败关系,如果两个人之间发生斗争,实力强的一方会获胜,而实力弱的一方会被击败退出游戏。一开始每个人物只会跟编号排在他后面的人接触,比如人物1会跟人物2之间斗争,人物2会跟人物3斗争,人物n会跟人物1斗争。当人物消失后,胜者就会接触到下一个人物,比如人物1战胜了人物2,人物2退出了游戏,那它就会跟人物3之间产生斗争。各个人物之间的胜败情况是固定的。最终游戏中只会剩下一个人,成为游戏最终的胜者。但是人物不同的战斗顺序,最终胜利的这个人可能不同。
现在的问题是,在这场“黄金的魔女”设下的棋局中,“绝对的魔女”使得人物与人物的胜败关系是确定的,而“奇迹的魔女”想知道,这场游戏中,都有哪些人是有可能生存下来的。

Input

有多组数据,第一行是一个整数n表示事件的数目。(2<=n<=100)
随后的n行是一个n行n列的矩阵。矩阵中的第i行第j列,如果为1,表示人物i与人物j斗争时人物i会胜利。为0则表示,表示人物i与人物j斗争时人物j会胜利。

Output

对于每组测试数据,第一行输出一个k表示有多少个人物可能获胜,接下来的k行每行输出一个人物的编号,编号从小到大输出。

Sample Input

3
0 1 0
0 0 1
1 0 0

2
0 0
1 0
Sample Output

3
1
2
3
1
2

 

思路:和lrj的例题决斗思路一样,meet[i,j]表示是否有可能i和j相遇, 则第i个人能取得最后的胜利当且仅当meet[i,i]为true.如果i最后能碰到自己,即她能存留下来

状态转移: 考虑相遇前的最后一步, 则meet[I,j]为true当且仅当–能找到一个k, 使得i能遇k, k能遇到j, 且i或者j能打败k.
代码如下:

#include<stdio.h>
#include<string.h>
int meet[103][103], d[103][103];
int main()
{
int n, i, t, j, k, mm;
while(scanf("%d", &n)!=EOF)
{
memset(d, 0, sizeof(d));
memset(meet, 0, sizeof(meet));
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
scanf("%d", &mm);
if(mm==1)
d[i][j]=1;
}
}
for(i=0; i<n-1; i++)
meet[i][i+1]=1, meet[i+1][i]=1;
meet[0][n-1]=1, meet[n-1][0]=1;
int flag;
for(t=2; t<=n; t++)
for(i=0;i<n;i++)
{
j=(i+t)%n;
flag=0;
for(k=(i+1)%n; k!=j; k=(k+1)%n)
{
if(meet[i][k]&&meet[k][j]&&(1==d[i][k]||1==d[j][k]))
{
meet[i][j]=1;
flag=1;
break;
}
}
if(!flag)
meet[i][j]=0;
}
int num=0;
for(i=0; i<n; i++)
if(meet[i][i])
num++;
printf("%d\n", num);
for(i=0; i<n; i++)
if(meet[i][i])
printf("%d\n", i+1);
}
return 0;
}

转载于:https://www.cnblogs.com/Hilda/archive/2012/07/31/2616789.html

HRBUST 1162 魔女【DP】相关推荐

  1. Hrbust 1162 魔女 【dp】

    魔女 Time Limit: 1000 MS Memory Limit: 65536 K Total Submit: 153(59 users) Total Accepted: 44(30 users ...

  2. 【UVA - 10891 Game of Sum 】【HRBUST - 1622】 Alice and Bob (区间dp,博弈问题)

    题干: 有一个长度为N的整数序列,Alice和Bob轮流取数,Alice先取.每次玩家只能从左端或者右端 取一个或多个数,但不能两端都取.所有数都被取走后游戏结束,然后统计每个人取走的所有数之和, 作 ...

  3. HRBUST 2011【简单dp】

    题意:N位士兵站成一排,长官要请其中的(N-K)位出列,使得剩下的K位士兵排成一等队形.一等队形是指这样的一种队形:设K位士兵从左到右依次编号为1,2-,K,他们的身高分别为T1,T2,-,TK, 则 ...

  4. 【 HRBUST - 1055】Single(模拟,dp,打表)(总结)

    题干: There are many handsome single boys in our team, for example, me. Some times, we like count sing ...

  5. Hrbust 1837 Dream【dp】

    Dream Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 13(8 users) Total Accepted: 3(3 users) ...

  6. 【基础dp】HRBUST 1861 猥琐宅男——koko

    猥琐宅男--koko Time Limit: 1000 MS Memory Limit: 32768 K Description 唔..从前有个小胖子叫koko(QAQ...)很喜欢吃香蕉,茄子和黄瓜 ...

  7. hihoCoder #1162 : 骨牌覆盖问题·三 (矩阵快速幂,DP)

    题意:有一个k*n的棋盘,要求用1*2的骨牌来铺满,有多少种方案?(k<8,n<100000001) 思路: 由于k是比较小,但是又不那么小,可以专门构造这样的一个矩阵M,使得只要我们有一 ...

  8. hrbust 2382(数位dp+二分)

    极难的问题 Time Limit: 1000 MS Memory Limit: 200000 K Total Submit: 20(9 users) Total Accepted: 6(6 users ...

  9. bzoj 1040: [ZJOI2008]骑士 树形dp

    题目链接 1040: [ZJOI2008]骑士 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3054  Solved: 1162 [Submit] ...

最新文章

  1. leetcode-25 K个一组反转链表
  2. 听说你有10年的工作经验?还是你把1个经验反复用了10年?
  3. ncnn tensorrt
  4. Docker中宿主机与容器之间互传文件(docker cp的方式)
  5. 网络安全-windowserver搭建DHCP服务器
  6. 【全链路质量监控与QoE】
  7. Script标签解决跨域
  8. 找出游戏的必胜的策略(博弈论的学习)
  9. 刘作虎:二次购机潮即文艺复兴时
  10. 窗口看门狗与独立看门狗区别
  11. 程序设计天梯赛——T1(15分)java版
  12. 怎么用计算机实现复数开平方,用你手中的计算器进行复数运算
  13. iOS 第三方框架-Masonry的使用
  14. 不要在该约炮的年纪谈佛系
  15. Qt信息隐藏(Q_D/Q_Q)介绍
  16. BZOJ1003 物流运输(dp+spfa)
  17. CPS平台License完稿
  18. 云原生应用之对象存储设计方案
  19. DM500 机器后面天线ANT OUT 口有什么用?
  20. python传参是什么意思_Python传参传什么?

热门文章

  1. android x86引导修复,Android-x86 9.0-r2 发布,更新内核与UEFI引导修复
  2. ESP8266+水墨屏
  3. Active Directory之AD对象
  4. AIX环境:su 到实例用户下连库并执行Db2命令方法
  5. Life feelings--6--有一天感到没有动力了怎么办?--怎样找到持久的热情?
  6. 设计一个不浪费水的热水器
  7. Python:对图片批量进行重命名
  8. 洛谷 P2336 [SCOI2012]喵星球上的点名 解题报告
  9. USB口的条形码扫描器接口编程(VB) 转
  10. 两个坐标系转换的变换矩阵