• nyoj 110 剑客决斗


    描述

    在路易十三和红衣主教黎塞留当权的时代,发生了一场决斗。n个人站成一个圈,依次抽签。抽中的人和他右边的人决斗,负者出圈。这场决斗的最终结果关键取决于决斗的顺序。现书籍任意两决斗中谁能胜出的信息,但“A赢了B”这种关系没有传递性。例如,A比B强,B比C强,C比A强。如果A和B先决斗,C最终会赢,但如果B和C决斗在先,则最后A会赢。显然,他们三人中的第一场决斗直接影响最终结果。
    
    假设现在n个人围成一个圈,按顺序编上编号1~n。一共进行n-1场决斗。第一场,其中一人(设i号)和他右边的人(即i+1号,若i=n,其右边人则为1号)。负者被淘汰出圈外,由他旁边的人补上他的位置。已知n个人之间的强弱关系(即任意两个人之间输赢关系)。如果存在一种抽签方式使第k个人可能胜出,则我们说第k人有可能胜出,我们的任务是根据n个人的强弱关系,判断可能胜出的人数。
     
    输入
    第一行是一个整数N(1<=N<=20)表示测试数据的组数。
    第二行是一个整数n表示决斗的总人数。(2<=n<=500)
    随后的n行是一个n行n列的矩阵,矩阵中的第i行第j列如果为1表示第i个人与第j个人决斗时第i个人会胜出,为0则表示第i个人与第j个人决斗时第i个人会失败。
    输出
    对于每组测试数据,输出可能胜出的人数,每组输出占一行
    样例输入
    1
    3
    0 1 0
    0 0 1
    1 0 0
    样例输出
    3

    把环看成一条链
    动态规划题,跟弗洛伊德算法很相似
    题解:
         编号为x的人能从所有人中胜出,必要条件是他能与自己相遇,
    即把环看成链,x点拆成两个在这条链的两端,中间的人全部被淘汰出局,x保持不败。
    这样,在连续几个人的链中,只须考虑头尾两个人能否胜利会师,中间的则不予考虑,
    从而少了一维状态表示量。
    设meet[i,j]记录i和j能否相遇,能相遇则为true,否则为false。状态转移方程为
    if(存在meet[i][t] && meet[t][j]) && (fight[i][t] || fight[j][t]=true) && i < t < j)
         meet[i][j] = true;
    else
         meet[i][j] = falze;

    AC代码:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 using namespace std;
     5 #define N 506
     6 int n;
     7 int mp[N][N];
     8 int dp[N][N];//dp[i][j]
     9 int main()
    10 {
    11     int t;
    12     scanf("%d",&t);
    13     while(t--){
    14        scanf("%d",&n);
    15        for(int i=0;i<n;i++){
    16           for(int j=0;j<n;j++){
    17              scanf("%d",&mp[i][j]);
    18           }
    19        }
    20        memset(dp,0,sizeof(dp));
    21        for(int i=0;i<n;i++){
    22           dp[i][(i+1)%n]=1;
    23        }
    24 
    25        for(int len = 1;len<n;len++){
    26           for(int i=0;i<n;i++){
    27              int j = (i+len+1)%n;
    28              if(dp[i][j]) continue;
    29              for(int k=(i+1)%n;k!=j;k++,k%=n){
    30                   if(dp[i][k] && dp[k][j] && (mp[i][k] || mp[k][j])){
    31                      dp[i][j]=1;
    32                      break;
    33                   }
    34              }
    35           }
    36        }
    37 
    38        int ans = 0;
    39        for(int i=0;i<n;i++){
    40           if(dp[i][i]){
    41              ans++;
    42           }
    43        }
    44        printf("%d
    ",ans);
    45 
    46     }
    47     return 0;
    48 }
  • 相关阅读:
    新浪微盘又是一个给力的产品啊,
    InfoQ: 百度数据库架构演变与设计
    列式数据库——Sybase IQ
    MapR初体验 淘宝共享数据平台 tbdata.org
    IBM正式发布新一代zEnterprise大型机(组图) 大型机,IBM,BladeCenter,美国,纽约 TechWeb News
    1TB is equal to the number of how many GB? 1PB equal to is equal to the number of TB? 1EB PB? | PCfault.com
    Cassandra vs HBase | WhyNosql
    The Hadoop Community Effect
    雅虎剥离开源软件平台 Hadoop ,与风投新建 Hortonworks 公司 品味雅虎
    RowOriented Database 、ColumnOriented Database 、KeyValue Store Database 、DocumentOriented Database
  • 原文地址:https://www.cnblogs.com/UniqueColor/p/5435697.html
Copyright © 2020-2023  润新知