关闭

NYoj110 剑客决斗

303人阅读 评论(0) 收藏 举报
分类:

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=110

分析:

      这道题真是没想到是动态规划,已开始认为是图论,想了好久只有最大流才能求出值,但是构不图。。(还是太弱啊)。 看了一篇博客 才知道是区间动态规划。

考虑 x 是否能赢得战斗,把环看成链,x点拆成两个,分别作为链的起点和终点。这样能胜出的条件就是自己和自己相遇。

状态为meet【i】【j】 表示i, j能相遇,这样就可以枚举i和j中的一点k,只要i或j能战胜k, i, j就能相遇了(只要找到一个点即可结束,不然会超时)

 Ac代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn = 510;
int bear[maxn][maxn];
bool meet[maxn][maxn];
int main()
{
    int T, n;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d", &n);
        for(int i = 0; i < n; i++)
            for(int j = 0; j < n; j++)
                scanf("%d", &bear[i][j]);
        memset(meet, false, sizeof(meet));
        for(int i = 0; i < n; i++)
            meet[i][(i+1)%n] = true;
        for(int d = 2; d <= n; d++)
        {
            for(int i = 0; i < n; i++)
            {
                int j = i+d;
                for(int k = i+1; k < j; k++)
                    if(meet[i][k%n] && meet[k%n][j%n] && (bear[i][k%n]||bear[j%n][k%n]))
                    {
                        meet[i][j%n] = true;
                        break;//不能少,不然超时
                    }
            }
        }
        int ans = 0;
        for(int i = 0; i < n; i++)
            if(meet[i][i])
                ans++;
        printf("%d\n", ans);
    }
    return 0;
}



 


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:28077次
    • 积分:1272
    • 等级:
    • 排名:千里之外
    • 原创:101篇
    • 转载:16篇
    • 译文:0篇
    • 评论:2条
    最新评论