2019 ICPC Asia Nanjing Regional 重现赛

C. Digital Path
题意:
给出一个网格,格子里面有各自的值,要求找出有多少条线路,是从某一个块四周自己最小开始走到某一个块,四周自己最大并且长度大于等于四。

解:显然,对于某一块,我们判断他能不能成为起点,就可以判断他的上下左右是否比他小1,比他小1那么肯定不能作为起点。判断终点同理。
那么针对每一个起点,我们首先暴力dfs,判断他的上下左右是否满足比他刚好大1,有的话继续dfs下去。
这样我们得到了一个暴力算法然后考虑优化。
令dp[i][j][len]表示,第(i,j)块,作为某一条链的第len个的时候,一共有多少种方法,这样我们就能记忆化搜索,针对某一块如果已经搜索过了,比如我从另一个5搜索到了6,那么6后面对应的所有情况一定满足当前的5。所以我们能记忆化。
同时考虑len的长度,我们令他从1-5,大于四的情况全部压缩成为5,因为不影响判断,只要大于四的情况,都是一样的不会造成干扰,而小于四的情况,可能会有长度不够四的情况。
(感觉这场好难。。。队友都写自闭了)

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<climits>
#include<stack>
#include<vector>
#include<queue>
#include<set>
#include<bitset>
#include<map>
//#include<regex>
#include<cstdio>
#define up(i,a,b)  for(int i=a;i<b;i++)
#define dw(i,a,b)  for(int i=a;i>b;i--)
#define upd(i,a,b) for(int i=a;i<=b;i++)
#define dwd(i,a,b) for(int i=a;i>=b;i--)
//#define local
typedef long long ll;
typedef unsigned long long ull;
const double esp = 1e-6;
const double pi = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int inf = 1e9;
using namespace std;
ll read()
{
    char ch = getchar(); ll x = 0, f = 1;
    while (ch<'0' || ch>'9') { if (ch == '-')f = -1; ch = getchar(); }
    while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
    return x * f;
}
typedef pair<int, int> pir;
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define lrt root<<1
#define rrt root<<1|1
const int N = 1e3 + 10;
const int mod = 1e9 + 7;
int grp[N][N];
int vis[N][N];
int dx[4] = { 0,1,0,-1 };
int dy[4] = { 1,0,-1,0 };
ll dp[N][N][6];
int n, m;
int dfs(int i,int j,int len)
{
    //printf("%d", 1);

    vis[i][j] = 1;
    if (len > 5)len = 5;
    if (dp[i][j][len] != -1) { vis[i][j] = 0; return dp[i][j][len]; }
    ll &ans = dp[i][j][len];
    ans = 0;
    bool flag = 1;
    up(k, 0, 4)
    {
        int xx = dx[k] + i;
        int yy = dy[k] + j;
        if (xx<1 || xx>n || yy<1 || yy>m||vis[xx][yy])continue;
        if(grp[xx][yy]==grp[i][j]+1)
            ans = (ans + dfs(xx,yy, len+1)) % mod,flag=0;
    }
    vis[i][j] = 0;
    if (flag&&len>=4)ans++;
    return ans;
}
int main() {
    n = read(), m = read();
    upd(i, 1, n)
        upd(j, 1, m)grp[i][j] = read();
    memset(dp, -1, sizeof(dp));
    memset(vis, 0, sizeof(vis));
    ll ans = 0;
    upd(i, 1, n)
    {
        upd(j, 1, m)
        {
            bool flag = 0;
            up(k, 0, 4)
            {
                int xx = dx[k] + i;
                int yy = dy[k] + j;
                if (xx<1 || xx>n || yy<1 || yy>m || vis[xx][yy])continue;
                if (grp[xx][yy] == grp[i][j] - 1)flag = 1;
            }
            if(!flag)
                ans = (ans + dfs(i, j, 1)) % mod;
        }
    }
    printf("%d", ans);
    return 0;
}

原文地址:https://www.cnblogs.com/LORDXX/p/11984922.html

时间: 2024-08-30 12:23:36

2019 ICPC Asia Nanjing Regional 重现赛的相关文章

2019 ICPC Asia Nanjing Regional F. Paper Grading

题目链接:https://nanti.jisuanke.com/t/42400 题意:给一个模式串集合,序号1~n,有T个操作,或者是交换序号,或者是查询模式串集合中序号在L到R之 间的字符串有多少个和目标串公共前缀长度大于等于K. --------------------------------- 对模式串集合建字典树,则与目标串\(LCP\)大于等K的字符串,都在以目标串第\(K\)个字符所在的结点为根的子树中,每个模式串插入字典树的过程中记录序号,修改时交换序号,询问就相于在子树中询问有多

2019 ICPC Asia Yinchuan Regional

目录 Contest Info Solutions A. Girls Band Party B. So Easy D. Easy Problem E. XOR Tree F. Function! G. Pot!! H. Delivery Route I. Base62 K. Largest Common Submatrix N. Fibonacci Sequence Contest Info Practice Link Solved A B C D E F G H I J K L M N 9/1

The 2019 ICPC Asia Shanghai Regional Contest-B-Prefix Code

知识点:字典树. 题目链接: https://ac.nowcoder.com/acm/contest/4370/B 题意:t组数据,n个数字,问是否满足不存在任何一个数字是其他数字的前缀. 题解:套用字典树一个一个插入字符串.若在插入过程中遇到如下两种情况,则存在其中一个是另一个的前缀. 1.遍历完整个字符串都没有创造新的节点,说明该字符串是之前某个串的字串. 2.遍历过程中遇到了某个字符串的终点,说明存在一个字符串是该字符串的前缀. 若都不存在,则满足条件. AC代码: 1 #include

The 2019 ICPC Asia Shanghai Regional Contest---H Tree Partition 二分答案,从下往上切最大子树

题意:https://ac.nowcoder.com/acm/contest/4370 将一棵树切k-1刀分成k棵树,问这k棵树里最大的权值的最小值是多少 思路:https://www.cnblogs.com/ucprer/p/11931263.html 二分最大值. dfs割子树,每次从下往上切一个最大的树. 单个dfs表示保证当前节点可切,然后子树dfs完了,sort子树,选最大的切,直到当前u节点也可切 1 #define IOS ios_base::sync_with_stdio(0);

The 2019 ICPC Asia Shanghai Regional Contest-C-Spanning Tree Removal

知识点:构造.思维. 题目链接:https://ac.nowcoder.com/acm/contest/4370/D 题意:n点完全图,每次可以删除一个生成树的边,问最多可以删几次,并构造出其中一种. 题解:给出一种删边方式可以尽可能多次的删除:第i次:从i开始.依次删除i-(i+1)-(i-1)-(i+2)-(i-2)-…… 直到连接完所有点为止.总共可以删除n/2次. AC代码: 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 i

hdu5512 Pagodas(2015ACM/ICPC亚洲区沈阳站-重现赛(感谢东北大学) )

Pagodas Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 14 Accepted Submission(s): 13 Problem Description n pagodas were standing erect in Hong Jue Si between the Niushou Mountain and the Yuntai M

2017ACM/ICPC亚洲区沈阳站-重现赛(感谢东北大学)HDU6225.Little Boxes-大数加法

整理代码... Little Boxes Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 2304    Accepted Submission(s): 818 Problem Description Little boxes on the hillside.Little boxes made of ticky-tacky.Littl

2018-2019, ICPC, Asia Yokohama Regional Contest 2018 (Gym - 102082)

2018-2019, ICPC, Asia Yokohama Regional Contest 2018 A - Digits Are Not Just Characters 签到. B - Arithmetic Progressions 题意:从给定的集合中选出最多的数构成等差数列. 题解:数字排序后,设\(dp[i][j]\)表示等差数列最后一个数字为\(a[i]\),倒数第二个数字为\(a[j]\)的最大个数.然后对于每一位枚举 \(i\),\(lower\_bound()\)找有无合法的

2018 ICPC Asia Singapore Regional A. Largest Triangle (计算几何)

题目链接:Kattis - largesttriangle Description Given \(N\) points on a \(2\)-dimensional space, determine the area of the largest triangle that can be formed using \(3\) of those \(N\) points. If there is no triangle that can be formed, the answer is \(0\