首页 > 其他分享 >2024.11.26

2024.11.26

时间:2024-11-26 22:13:53浏览次数:5  
标签:26 2024.11 int res ch && ans Dp

今日总结
上午打南外的比赛,只会做第一题的Dp第二题的数位Dp差一点就想出来了,第三题打暴力挂了,第四题不会,下午吃饭前改完了第二题,晚上做了今天没有写的二本的比赛的前两题
1:团子制作
这道题是Dp加搜索的结合,需要一边搜索,一边进行Dp转移,一定要处理好边界问题,转移时要注意是二维转移

点击查看代码
#include<bits/stdc++.h>

using namespace std;

const int N = 3e3 + 10;

int n,m,ans;
int dp[N *2][5];
char c[N][N];

bool hang(int x,int y)
{
	return x >= 2 && x <= n - 1 && c[x - 1][y] == 'R' && c[x][y] == 'G' && c[x + 1][y] == 'W';
}

bool lie(int x,int y)
{
	return y >= 2 && y <= m - 1 && c[x][y - 1] == 'R' && c[x][y] == 'G' && c[x][y + 1] == 'W';
} 

int main()
{
    freopen("b.in","r",stdin);
    freopen("b.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i = 1;i <= n;i ++)
		for(int j = 1;j <= m;j ++)
			cin >> c[i][j];
    for(int i = 2;i <= n;i ++)
	{
		for(int j = 0;j <= max(n,m);j ++)
			dp[j][0] = dp[j][1] = dp[j][2] = dp[j][3] = 0;
		int u = 0,x = i,y = m;
		while(x >= 1 && x <= n && y >= 1 && y <= m)
		{
			u ++;
			dp[u][0] = max(dp[u - 1][0],max(dp[u - 1][1],max(dp[u - 1][2],dp[u - 1][3])));
			dp[u][1] = max(dp[u - 1][0],dp[u - 1][1]) + lie(x,y);
			dp[u][2] = max(dp[u - 1][0],dp[u - 1][2]) +hang(x,y);
			x ++,y --;
		}
		ans += max(dp[u][0],max(dp[u][1],max(dp[u][2],dp[u][3])));
	}
	for(int i = 1;i <= m;i ++)
	{
		for(int j = 0;j <= max(n,m);j ++)
			dp[j][0] = dp[j][1] = dp[j][2] = dp[j][3] = 0;
		int u = 0,x = 1,y = i;
		while(x >= 1 && x <= n && y >= 1 && y <= m)
		{
			u ++;
			dp[u][0] = max(dp[u - 1][0],max(dp[u - 1][1],max(dp[u - 1][2],dp[u - 1][3])));
			dp[u][1] = max(dp[u - 1][0],dp[u - 1][1]) + lie(x,y);
			dp[u][2] = max(dp[u - 1][0],dp[u - 1][2]) + hang(x,y);
			x ++,y --;
		}
		ans += max(dp[u][0],max(dp[u][1],max(dp[u][2],dp[u][3])));
	}
	printf("%d\n",ans);
	return 0;
}

2:JinTianHao 和二叉树迷宫
这道题是一个比较神奇的数位Dp,这道题很容易判断错是向左还是向右,一定要注意!!!

点击查看代码
#include<bits/stdc++.h>

using namespace std;

const int N = 1010;
const int Mod = 1e9 + 7;
#define add(x,y) x = (x + y) % Mod

int n,k,ans;
int dp[N][N][2][2][2],g[N][N][2][2][2];
char s[N],l[N],r[N];

int main()
{
    freopen("maze.in","r",stdin);
    freopen("maze.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> n >> k;
    cin >> s >> l >> r;
    dp[0][0][1][1][1] = g[0][0][1][1][1] = 1;
    for(int i = 0;i < n;i ++)
    {
        for(int j = 0;j <= k;j ++)
        {
            for(int a = 0;a <= 1;a ++)
            {
                for(int b = 0;b <= 1;b ++)
                {
                    for(int c = 0;c <= 1;c ++)
                    {
                        if(dp[i][j][a][b][c])
                        {
                            if(!a || l[i + 1] == '0') add(g[i + 1][j + (i && c != (s[i] == 'L'))][a][b && r[i + 1] == '0'][s[i] == 'L'], g[i][j][a][b][c]),add(dp[i + 1][j + (i && c != (s[i] == 'L'))][a][b && r[i + 1] == '0'][s[i] == 'L'], dp[i][j][a][b][c] * 2 % Mod); 
                            if(!b || r[i + 1] == '1') add(g[i + 1][j + (i && c != (s[i] == 'R'))][a && l[i + 1] == '1'][b][s[i] == 'R'], g[i][j][a][b][c]),add(dp[i + 1][j + (i && c != (s[i] == 'R'))][a && l[i + 1] == '1'][b][s[i] == 'R'], dp[i][j][a][b][c] * 2ll + g[i][j][a][b][c]);
                        }
                    }
                }
            }
        }
    }
    for(int j = k - 1;j <= k;j ++)
        for(int a = 0;a <= 1;a ++)
            for(int b = 0;b <= 1;b ++)
                for(int c = 0;c <= 1;c ++)
                    add(ans,dp[n - 1][j][a][b][c]);
    cout << ans << endl;
    return 0;
}

3:
这道题是一道贪心题,但是需要用带全排列的情况,用类似的减法原理,来解决

点击查看代码
//字符串哈希
#include<bits/stdc++.h>

using namespace std;

#define int long long 

const int N = 1e6 + 10;

int ans;
int s[N];
string a,b;

signed main()
{
    cin >> a >> b;
    int lena = a.length(),lenb = b.length();
    for(int i = 0;i < lenb;i ++)
        s[b[i] - 'a'] ++;
    ans = (lena + 1) * (lenb + 1);
    for(int i = 0;i < lena;i ++) 
        ans -= s[a[i] - 'a'];
    printf("%lld\n",ans);
    return 0;
}

4:
这道题是一道树形Dp加上贪心加上数学的题目,这里的主要难点是对中位数的解读,如果这个解决了,剩下的动态转移方程很好想出

点击查看代码
#include <bits/stdc++.h>
#define int long long

using namespace std;

int read()
{
    int x = 0, w = 1;
    char ch = 0;
    while (ch < '0' || ch > '9')
    {
        if (ch == '-')
            w = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9')
    {
        x = (x << 1) + (x << 3) + (ch ^ '0');
        ch = getchar();
    }
    return x * w;
}

void write(int x)
{
    if (x < 0)
    {
        x = -x;
        putchar('-');
    }
    if (x > 9)
        write(x / 10);
    putchar(x % 10 ^ '0');
}

const int N = 5e5 + 5, inf = 1e18;

int n, m;
int w[N];
int h[N], tot;
int d[N];
int res;
int mx[N];
int f[N][2];

struct edge
{
    int to, nxt;
} e[N << 1];

void add(int u, int v)
{
    e[++tot] = (edge){v, h[u]};
    h[u] = tot;
}

void dfs(int u, int fa)
{
    if (d[u] == 1 && u != 1)
        return f[u][1] = -inf, void();
    priority_queue<int> q;
    int res = 0, t = 0, p = 0;
    for (int i = h[u]; i; i = e[i].nxt)
    {
        int j = e[i].to;
        if (j == fa)
            continue;
        dfs(j, u);
        t = max(f[j][1] + w[u], f[j][0] + min(w[u], w[j]));
        p = max(f[j][1] + m, f[j][0] + w[j]);
        res += p;
        q.push(t - p);
    }
    for (int i = 1; i < mx[u]; i++)
    {
        int tt = q.top();
        q.pop();
        res += tt;
    }
    f[u][0] = res;
    f[u][1] = res + (q.size() ? q.top() : -inf);
}

signed main()
{
    n = read(), m = read();
    for (int i = 1; i <= n; i++)
        w[i] = read();
    for (int i = 1; i < n; i++)
    {
        int u = read(), v = read();
        add(u, v), add(v, u);
        d[u]++, d[v]++;
    }
    for (int i = 1; i <= n; i++)
        mx[i] = d[i] / 2 + 1;
    dfs(1, 0);
    write(f[1][1]), puts("");
    return 0;
}

标签:26,2024.11,int,res,ch,&&,ans,Dp
From: https://www.cnblogs.com/lucky-myself/p/18571052

相关文章

  • Java学习笔记——2024.11.26
    2024.11.26一、整数类型二、整数类型的使用细节intn1=1;longn2=1L;三、浮点数1.浮点数使用2.浮点数细节//2floatnum1=1.1//默认为double,但是没有写f,前面却定义了float类型,所以不允许。floatnum2=1.1F;//对的doublenum3=1.1;//对的doublenum4=1.1......
  • 2024.11.23至26联考总结
    前言因为各种原因,我近几天的总结一直被鸽,直到今天(11.26)已经堆积了三场。然后个人觉得这几天的联考还是很有总结必要,所以就大概复盘一下考试,然后再聊一点题目难度、做法、改题情况以及小小的总结一下。11.23复盘开始考试后先看了T1,第一眼没有看出什么眉目然后看后面三道。看了......
  • 2024.11.26 鲜花
    传话游戏题解七里香窗外的麻雀在电线杆上多嘴你说这一句很有夏天的感觉手中的铅笔在纸上来来回回我用几行字形容你是我的谁秋刀鱼的滋味猫跟你都想了解初恋的香味就这样被我们寻回那温暖的阳光像刚摘的鲜艳草莓你说你舍不得吃掉这一种感觉雨下整夜我的爱溢出就......
  • SS241126C. 树(tree)
    SS241126C.树(tree)题意给你一个以\(1\)为根的树,每个点有点权\(v_i\)。设这棵树的点集为\(V\),一个合法的子集\(V'\subseteqV\),满足存在\(p\inV'\),使得\(V'\)中任意两点的LCA都是\(p\)。把\(V\)分成若干个\(V'\)称为一种划分方案,一种划分方案\(\{V'\}\)的......
  • NOIP2024 前集训:多校A层冲刺NOIP2024模拟赛26
    前言点击查看代码《看得最远的地方》你是第一个发现我越面无表情越是心里难过所以当我不肯落泪地颤抖你会心疼的抱我在胸口你比谁都还了解我内心的渴望比表面来得多所以当我跌断翅膀的时候你不扶我但陪我学忍痛我要去看得最远的地方和你手舞足蹈聊梦想像......
  • 2024/11/26 NFLS树上问题笔记
    树现在他想解决这样一个问题:给定一颗有根树(根为1),有以下两种操作:标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均无标记,而且对于某个结点,可以打多次标记)。询问操作:询问某个结点最近的一个打了标记的祖先(这个结点本身也算自己的祖先)你能帮帮他吗?树剖但是暴力能......
  • 11.26
    100+40+40+20=200。总体上感觉还行,B赛时想了个神秘东西,不过没有实现(事实证明这是正确的选择),但是C不会启发式分裂吃大亏。闲话一个非常重要的问题是在不会手写哈希表的情况下应该使用什么来当作哈希表。\(\text{unordered_map}\)和\(\text{gp_hash_table}\)被卡的概率都......
  • 2024.11.26总结
    本文于github博客同步更新。A:学生大战一个半小时未果,结束前半小时发现是打表找规律。就是分讨一下,首先大于\(1\)的数不能超过两个,若有两个则其中一个必定为\(2\),然后看一下\(1\)的个数是不是\(3\)的倍数即可。B:拆贡献,分为\(u\rightarrowlca\)和\(lca\rightarrow......
  • [ARC126E] Infinite Operations
    不妨把\(a\)排序。考虑一个特殊情况:\(a_1=a_2=\cdots=a_{n-1}=0\),\(a_n=x\)。不妨设此时答案为\(F(n,x)\)。可以递归把\(a_2,a_3,\cdots,a_{n}\)全部变为\(\dfrac{x}{n-1}\),然后全部取相反数后就是相同问题。可以归纳证明\(F(n,x)\)的下界是\(\dfrac{(n-1)x}{2}\)。对......
  • 『模拟赛』多校A层冲刺NOIP2024模拟赛26
    Rank有点唐A.随机游走签。重要的就后两句话。题意由此转化成:到每一个节点时,先后遍历其所有子节点的子树,使得\(\sumt_i\timesw_i\)最小。提前dfs一遍处理出便利完某棵子树所需要的总时间和子树总价值,容易发现对于两个子节点的子树来说,全部遍历完所需总时间是一样的,......