首页 > 其他分享 >Acwing 1027.方格取数

Acwing 1027.方格取数

时间:2024-09-28 22:35:06浏览次数:1  
标签:1027 int i2 j1 j2 取数 i1 && Acwing

题目链接

算法1

(数字三角性模型)

这道题是摘花生 题目的延申

摘花生:走一条路

这道题与摘花生题的区别在于走的路数,该题走两条路,而且是两条路同时走的思想。

那么按照摘花生的题的思路,能否两条路各自取最大值呢?

答案是不行。

因为第一次摘花生,第一次的最优解已经影响到第二次的最优解了。两次分开走并不是全局最优的。只能dp同时走才可以找到全局最优方案。

例:

0  1  0
2  2  2
1  0  0

如果分两次,第一次最优肯定是把三个2取到然后结束,第二次就只能取一个1。
如果同时来,那么是可以把所有的数都取下的。

上述例子来源于评论区

1.状态定义:

f[i1][j1][i2][j2]:从(1,1),(1,1)分别走到(i1,j1),(i2,j2)的路径上的最大值

注意:同一个格子只能选择一次

我们可以发现两个路径走过的总步数是一样的。

因此只有在$i_1 + j_1 == i_2 + j_2$时,两条路径的格子才可能重合

可能重合的意思就是它不仅包含了重合的情况,而且包含了不重复的情况

这样我们可以从四维,降到三维

状态定义:f[k][i1][i2] : 表示所有从(1,1),(1,1)点出发,分别到达(i1,k-i1),(i2,k-i2)的路径上的最大值

其中k表示两条路线,当前走到的格子的横纵坐标之和,即 k: i1+ j1 = i2 + j2;

2.状态计算:

for(int k = 2; k <= n + n; k++){
    for(int i1 = 1; i1 <= n; i1++){
        for(int i2 = 1; i2 <= n; i2++)
        {
            int j1 = k - i1, j2 = k - i2;
            
            if(j1 >= 1 && j1 <= n && j2 >= 1 && j2 <= n)
            {
               //如果是同一个格子只加一次即可
               int t = w[i1][j1];   
               if(i1 != i2) t += w[i2][j2];
               
               int &x = f[k][i1][i2];
               
               //1.两条路都是从上方过来的
               x = max(x,f[k-1][i1-1][i2-1] + t);
               
               //2.第一条路是从左过来,第二条路是从上方过来的
               x = max(x,f[k-1][i1][i2-1] + t);
               
               //3.第一条路:从上来的,第二条路:从左来的
               x = max(x,f[k-1][i1-1][i2-1] + t);
               
               //4.两条路都是从左过来的
               x = max(x,f[k-1][i1][i2] + t);
            } 
        }
    }
     最终答案:f[n+n][n][n];
}

C++ 代码

#include <bits/stdc++.h>
using namespace std;

const int N = 15;

int n;
int w[N][N];
int f[N*2][N][N];

//两个横纵坐标最大值和为 N + N;


int main(){
    
    cin >> n;
    int a,b,c;
    while(cin >> a >> b >> c,a || b || c) w[a][b] = c;
    
    for(int k = 2 ; k <= n + n; k ++){
        for(int i1 = 1; i1 <= n; i1++){
            for(int i2 = 1; i2 <= n; i2++){
               
               //第一步先求纵坐标
               int j1 = k - i1, j2 = k - i2;
               
               //只有在边界内才能算出答案
               if(j1 >=1 && j1 <= n && j2 >= 1 && j2 <= n)
               {
                  int t = w[i1][j1]; //如果处在同一个格子只算一次
                  
                  if(i1 != i2) //不在同一个格子的时候
                  t += w[i2][j2];
                  
                  int &x = f[k][i1][i2];
                  x = max(x,f[k-1][i1-1][i2-1] + t);
                  x = max(x,f[k-1][i1-1][i2] + t);
                  x = max(x,f[k-1][i1][i2-1] + t);
                  x = max(x,f[k-1][i1][i2] + t);
                  
               }
            }
        }
    }
    
    cout << f[n+n][n][n];
    
    return 0;
}

标签:1027,int,i2,j1,j2,取数,i1,&&,Acwing
From: https://www.cnblogs.com/ltphy-/p/18438533

相关文章

  • Acwing 801.二进制中1的个数
    题意:给定一个长度为$n$的数列,请你求出数列中每个数的二进制表示中$1$算法1(lowbit())0.预备知识1.原码:符号位加上真值的绝对值2.反码:正数的反码是其本身,负数的反码是在其原码的基础上符号位不变,其余各个位取反。3.补码:正数的补码就是其本身,负数的补码是在其反码的基础上+......
  • 国产linux系统(银河麒麟,统信uos)使用 PageOffice 国产版在线打开 word文件并提取数据区
    PageOffice国产版:支持信创系统,支持银河麒麟V10和统信UOS,支持X86(intel、兆芯、海光等)、ARM(飞腾、鲲鹏、麒麟等)、龙芯(LoogArch)芯片架构。查看本示例演示效果本示例关键代码的编写位置Vue+Springboot注意本文中展示的代码均为关键代码,复制粘贴到您的项目中,按照实际的情况,例如......
  • Luogu_P10977(AcWing_299) Cut the Sequence 题解
    解题思路考虑线性dp。首先如果存在\(a_i>m\),那肯定不满足条件,输出\(-1\)。设\(f_i\)表示前\(i\)个数分成若干段,然后每段最大数之和,其中每段内的整数之和不超过\(m\)。\(f_i\)肯定是由\(f_j\)(\(1\lej<i\))转移过来的,也就是前\(j\)个数分好后再加上\((j,i]\)这一......
  • 为什么要使用API接口获取数据?
    在当今数字化和信息化的时代,数据已成为企业和开发者最宝贵的资产之一。API(应用程序编程接口)作为一种标准化的数据获取方式,正在迅速成为获取和共享数据的首选手段。本文将探讨为什么使用API接口获取数据是现代开发的最佳实践。1.高效的数据访问API接口提供了一种高效的方式......
  • 【接口自动化测试】jsonpath应用:提取数据、断言、接口关联
    安装命令pipinstalljsonpath表达式importjsonpathres=jsonpath.jsonpath(obj,expr)1、返回结果要么是list,要么是False2、obj 要提取的对象,应为字典类型。报文的格式是json,必须进行数据的转换, 用json.loads()将json转换成字典类型   expr jsonpath表......
  • 【油猴脚本】00011 案例 Tampermonkey油猴脚本,动态渲染表格-实现页面动态-添加提取数
    前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦......
  • Acwing题解系列——841. 字符串哈希
    #include<iostream>usingnamespacestd;constintN=100010;constintP=131;/*题解https://www.acwing.com/solution/content/24738/可以 把字符串变成一个p进制数字(哈希值),实现不同的字符串映射到不同的数字。采用字符的ascii码乘上P的次方来计算哈希值。X1X2X......
  • mongoDB 读取数据python版本实现
    要使用Python从MongoDB读取数据,你可以使用pymongo库。首先确保你已经安装了pymongo,如果没有安装,可以通过pip来安装它:pipinstallpymongo接下来,我将展示如何使用给定的MongoDB连接字符串来连接数据库,并从一个集合中读取数据。假设你想从名为mydatabase的数据库中的mycollecti......
  • 第140期 DeepGlobe道路提取数据集
    引言亲爱的读者们,您是否在寻找某个特定的数据集,用于研究或项目实践?欢迎您在评论区留言,或者通过公众号私信告诉我,您想要的数据集的类型主题。小编会竭尽全力为您寻找,并在找到后第一时间与您分享。DeepGlobe道路提取挑战:探索卫星图像中的道路网络在世界的各个角落,特别是在那些饱受......
  • AcWing 125. 耍杂技的牛
    算法1(贪心)题目要求牛的最大伤害值最小,那么我们使每头牛的伤害值最小,在其中找最大值作为答案如何使得每头牛的伤害值最小?(1)自身w值越大应该放到底部,使得被减数减小(2)自身s值越大应该放到底部,使得减数变大综上,w+s从小到大排序,最大的危险系数一定是最小的。贪心算法......