首页 > 其他分享 >24暑假集训day6上午&下午

24暑假集训day6上午&下午

时间:2024-08-03 17:17:35浏览次数:14  
标签:24 ch fa day6 int read Problem include 集训

DP

概念

状态、转移方程、初始化

先放一张图(相信都能理解:状态、转移方程、初始化的含义,随便引入斐波那契数列的题

入门题

Problem 1

斐波那契数列

\[f_i=f_{i-1}+f_{i-2} \]

组合数

转移方程:

\[C(n,m)=C(n-1,m-1)+C(n-1,m) \]

\[C(n,0)=1 \]

杨辉三角:

\[f[i][j]=f[i-1][j-1]+f[i-1][j] \]

Problem 2

\(N\cdot M\)的方格图只能向右或者向下求走到右下的方案数?
和走到右下的最小代价?

\[f[i][j]=\min(f[i][j-1],f[i-1][j])+z[i][j] \]

Problem 3

数字三角形给你一个三角形,问从怎么走能够取得最大代价

\[f[i][j]=\max(f[i-1][j],f[i-1][j+1])+z[i][j] \]

Problem 4

在上一个题的基础上变化为求和 \(\bmod100\)之后最大的结果

多一个条件

多一维状态

Problem 5

最长上升子序列求方案

\[f[i]=\max(f[j])+1 \]


dp 状态的判定

思考什么东西发生变化

\(f[\)位置\(][\)和\(]\implies f[i][j][k]\) 是否可能

走到 \((i, k)\) 和为 \(k\)

int f[位置] = 和

\(f[i][j]\) 走到 \((i, k)\) 和最大是多少


Problem 6

滑雪 \(N\) 行 \(M\) 列的图

  1. 每个格子有高度
  2. 可以滑向周围四个比自己矮的格子
  3. 最多能划多远

思路:

排序之后就是前面一道题

#include <iostream>
#include <queue>
#include <cmath>
#include <algorithm>
#include <vector>
#include <cstring>
#include <cstdio>
#include <set>
#include <map>
#include <unordered_map>
#include <bitset>
using namespace std;
const int MAXX = 1e5 + 10, MAXN = 1e9 + 10;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
int n, m;
int h[233][233], f[233][233];//f[i][j]代表从(i, j)这个位置出发 最远能滑多远 
bool g[233][233];//g[i][j]代表f[i][j]算过没 

int dx[10] = {-1, 1, 0, 0};//上下左右
int dy[10] = {0, 0, -1, 1};//dx[i], dy[i]代表的是在第i个方向下x的坐标和y坐标的偏差值 

const int M = 250 * 250;

pair<int, int> z[M];//z[i]代表一个坐标 

bool cmp(pair<int, int> a, pair<int, int> b){
	return h[a.first][a.second] > h[b.first][b.second];
}

int main(){
	n = read(), m = read();
	int k = 0;
	for(int i = 1;i <= n;i++){
		for(int j = 1;j <= m;j++){
			h[i][j] = read();//每个位置的高度 
			k++;
			z[k] = make_pair(i, j);
		}
	}
	sort(z + 1, z + k + 1, cmp);
	
	for(int a = 1;a <= k;a++){
		int i = z[a].first;
		int j = z[a].second;
		//取出当前坐标 
		//int h = ::h[i][j];
		//取出当前坐标高度 
		f[i][j] = max(f[i][j], 1);
		for(int d = 0;d < 4;d++){
			int x = i + dx[d];
			int y = j + dy[d];
			//从 (i,j)沿着方向d走一格会走到(x, y) 
			if(x >= 1 && x <= n && y >= 1 && y <= m)//判断(x, y)是否合法 
		          	if(h[i][j] > h[x][y])//(i, j)高度比(x, y)高度更高 
		          		f[x][y] = max(f[x][y], f[i][j] + 1);
		}
	}
	int ans = -1;
	for(int i = 1; i <= n; i ++)
		for(int j = 1; j <= n; j ++)
		          ans = max(ans, f[i][j]);
	cout << ans << endl;
	return 0;
}

Problem 7

乌龟棋

  1. 长度为 \(N\) 的格子上有权值
  2. \(M\) 张牌,上面有 \(1-4\) 中的一个数
  3. 使用一张牌往前走几步
  4. 最大化经过的位置的权值和

思路:

f[i][j][k][l][r]

考虑优化

#include<bits/stdc++.h>
using namespace std;
int f[45][45][45][45];
int g[5];
int a[400];
int main()
{
    int n,m;
    cin>>n>>m;
    int i,j,k,l;
    for(i=1;i<=n;i++)
        cin>>a[i];
    f[0][0][0][0]=a[1];
    for(i=1;i<=m;i++){
        int x;
        cin>>x;
        g[x]++;
    }
    for(i=0;i<=g[1];i++)
        for(j=0;j<=g[2];j++)
            for(k=0;k<=g[3];k++)
                for(l=0;l<=g[4];l++){
                    int move=1+i+2*j+3*k+4*l;
                    if(i!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i-1][j][k][l]+a[move]);
                    if(j!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i][j-1][k][l]+a[move]);
                    if(k!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k-1][l]+a[move]);
                    if(l!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k][l-1]+a[move]);
                }
    cout<<f[g[1]][g[2]][g[3]][g[4]]<<endl;
    return 0;
}

区间dp

所有的操作都是针对区间进行,不会有跨越两个元素的情况

Problem 1

合并石子

  1. 每次选择相邻两堆
  2. 代价为两堆石子和
  3. 问最小总代价

思路:

用 \(

标签:24,ch,fa,day6,int,read,Problem,include,集训
From: https://www.cnblogs.com/yantaiyzy2024/p/18340818

相关文章

  • 24暑假集训day5下午
    DFS本质:一种用于遍历或搜索树或图的算法。所谓深度优先,就是说每次都尝试向更深的节点走。该算法讲解时常常与BFS并列,但两者除了都能遍历图的连通块以外,用途完全不同,很少有能混用两种算法的情况。关键:递归调用自身对其访问过的点打上访问标记,在遍历图时跳过已打过标记的点,以......
  • 24暑假集训day5上午
    图论差分约束有\(......
  • 24暑假集训day4上午&下午
    基础图论图的存储方式无向边可以拆成两条有向边1.邻接矩阵邻接矩阵:若\(......
  • Day 8.2 NOIP2024 模拟赛 总结
    Day8.2NOIP模拟赛总结T1T1赛时打表输出发现了等差数列的性质(好像不需要打表也能知道),然后我码完T2过后剩不到2个小时了,于是连T3T4暴力都没码就过来推了,但也没推出来,时间倒是耽误了不少,剩一个小时的时候去开始去码后面的暴力了。T2水题一道,做法,性质全给了。只不过比较玄学的......
  • 20240803题解
    话说T3都把式子推出来了结果忘记差分约束怎么写了。光线(light)题面:有\(n\)个玻璃板,第\(i\)个玻璃板的透光率为\(a_i\%\),反射率为\(b_i\%\),有大小为\(1\)个单位的一束光从第\(1\)个玻璃板开始,有多少光能穿透\(n\)层玻璃板。题解:考虑\(n=2\)时,可以简单算出两个玻璃板组合后的反......
  • 【笔记】动态规划选讲:凸优化技术大赏 2024.8.3
    如果您是搜索引擎搜进来的。很抱歉,没有您需要搜索的题目的题解。典题\(n\)个物品的背包,重量在\(1\sim4\)之间,价值在\(1\sim10^9\)之间。\(n\leq10^5\)。Minkowski和会遇到不连续的问题。不妨按照\(i\bmod12\)划分dp数组,每个剩余系都是凸的。枚举拿了\(......
  • IPC-6012F-CN-中文版\英文版,2024 刚性印制板的鉴定及性能规范
    IPC-6012F-CN-中文版,2024刚性印制板的鉴定及性能规范链接:https://pan.baidu.com/s/1z1x5JPmcRHzeIQgMsMQRxg提取码:1234https://share.weiyun.com/s7XNX9gE 2023年10月,IPC-6012发布了最新版F版。与以往版本不同的是,F版中国成立了分技术组,收集,讨论和提交了大量制修订的意......
  • Day 8.1 NOIP2024 模拟赛 总结
    ​Day8.1NOIP2024模拟赛总结T1开赛后首先是码了本题的暴力,想了想之后只是感觉这个结构很像二叉树,然后没有细想,想着先码完后面的暴力再回来。T2Subtask2就是简单推性质,优化一下循环枚举顺序就可以了。当时想Subtask1的时候,本身是考虑枚举每一个点然后暴力向外拓展,时间......
  • docker安装zabbix 20240803
    宿主机IP:192.168.177.1281、下载数据库:dockerpullmysql:5.7 2、下载支持数据库的zabbix:dockerpullzabbix/zabbix-server-mysql:centos-latest 3、下载web容器:dockerpullzabbix/zabbix-web-nginx-mysql:latest  4、下载java监控:dockerpullzabbix/z......
  • 2024牛客多校6
    第五场太抽象了,失去补题欲望6ACake(A)首先假设字符串已经确定,对Oscar而言,由于一份蛋糕可以为空,在两人都尽可能取最大值的情况下,相当于忽略所有空的部分、只根据字符串的某个前缀\(s'\)划分蛋糕,按照字符串中0占比最大的前缀平均划分一定是最优的。回到游戏第一步,已知Oscar的......