数字三角形合集

简单介绍

  • 数字三角形这东西,出现了有一定的年头了。于是,出现了一些变种……

眼下已知的题目

  • Codevs1220 数字三角形

    • 这题是原版IOI1994啊……
    • f[i][j]=a[i][j]+max(f[i-1][j],f[i-1][j-1])。
  • Codevs2193 数字三角形ww 和 Codevs2198 数字三角形www
    • 改了。必须得经过一个点。而且2198是2193的数据规模上的加强版。
    • 然而这并没有什么L用,仅仅需让必须经过的点的权值加上一个特别大的值,最后的结果再减去这个值即可了。
    • 实际上,状态转移方程是没有变的。
  • Codevs2189 数字三角形w
    • 又改了。这回让你最后的结果取模最大。
    • 这回就不好办了,本来不小的一个数,加上那么一点点。再取模,可能就非常小了。显然这已经不再满足动态规划的无后效性原则了。

    • 怎么办?
    • 也非常好办,开一个布尔型的三维数组。记f[i][j][k]表示走到位置(i,j)时路径权值和再取模是否能得到k这个值,于是得到这样一个方程:f[i][j][k]=f[i][j][k] or f[i-1][j][(k-a[i][j]+m)%m] or f[i-1][j-1][(k-a[i][j]+m)%m]。这里面加上m是为了防止出现负下标。

      最后找一遍那个目标状态存在即可了。

  • Vijos1006 晴天小猪历险记之Hill

    • 好吧,个人感觉这题还是比較坑的,这回可就不是仅仅能光向左上或右上走了,而是还能够左右移动,而且从边界的一头还能够到达还有一头。

      最关键的是,要从左下角走到山顶……

    • 这回,又该怎么做呢?
    • 先回归最原始的数字三角形的思路。在那个题目中,我们把爬到了哪一层做为阶段,由于某一点近由其左下和右下的的点推导而来,是满足无后效性原则的。但在这个题目中。无后效性原则被打破,由于每一层是个环。还能左右移动。
    • 但实际上,这样的对后效性的影响是能够消除的。

      由于由一个走过的点扩展而来的状态在决策时。是不可能再去选择这个点的。

      这也就是说,左推仅仅能一直向左,右推仅仅能一直向右,也就是说。一个数的左右推值,仅仅会来自于它左右的两个数,显然左右推是不相互影响的。最后得到结果时。仅仅需将结果的四种来源取min,就能完毕任务。

      当然,边界是须要特殊处理的。

    • 详细的,在代码中有所解释。

代码

  • 个人认为。前三种不用给代码了,转移方程与思路都非常明白了……

  • 于是,以下是Vijos1006的代码:
#include<stdio.h>
#define maxint 2000000000
#define min(a,b) (a<b?

a:b)
long a[1000][1000]={0};
long d[1000][1000]={0};
int main()
{
    long n,i,j,k,tmp,x1,x2;
    scanf("%ld",&n);
    for(i=0;i<n;i++)
      for(j=0;j<=i;j++)
        scanf("%ld",&a[i][j]);

    for(i=0;i<n;i++)
      for(j=0;j<=i;j++)
        d[i][j]=maxint;

    for(i=0;i<n;i++)                                            //对最后一行的处理
      d[n-1][i]=a[n-1][i];
    for(i=1;i<n;i++)
      d[n-1][i]=d[n-1][i-1]+a[n-1][i];                          //由于最后一行右边的点仅仅能从左边的推来,所以有了这个预处理
    for(i=n-1;i>=0;i--)
      d[n-1][i]=min(d[n-1][i],d[n-1][(i+1)%n]+a[n-1][i]);       //往左走的话。肯定要先从左边翻过去再向左走 

    for(i=n-2;i>=0;i--)
    {
       d[i][0]=min(d[i+1][0],d[i+1][1]);                        //对左边界的处理
       d[i][0]=min(d[i][0],d[i+1][i+1]);
       d[i][0]+=a[i][0];

       d[i][i]=min(d[i+1][0],d[i+1][i]);                        //对右边界的处理
       d[i][i]=min(d[i][i],d[i+1][i+1]);
       d[i][i]+=a[i][i];

       for(j=1;j<=i-1;j++)                                      //对中间位置的处理。这时候以下的一行已经处理完了
         d[i][j]=min(d[i+1][j],d[i+1][j+1])+a[i][j];

       d[i][0]=min(d[i][0],d[i][i]+a[i][0]);                    //左推与右推
       for(j=1;j<=i;j++)
         d[i][j]=min(d[i][j],d[i][j-1]+a[i][j]);
       for(j=i;j>=0;j--)
         d[i][j]=min(d[i][j],d[i][(j+1)%(i+1)]+a[i][j]);

    }
    printf("%ld\n",d[0][0]);
    return 0;
}

感慨

  • 各个变种,层出不穷,但总之还都是棋盘型(坐标型)DP。
  • 最主要的状态转移方程还是IOI1994版的。是不变的。
时间: 2024-08-09 15:08:55

数字三角形合集的相关文章

Vim命令合集

来源:Vim命令合集 命令历史 以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令. 启动vim 在命令行窗口中输入以下命令即可 vim 直接启动vim vim filename 打开vim并创建名为filename的文件 文件命令 打开单个文件 vim file 同时打开多个文件 vim file1 file2 file3 ... 在vim窗口中打开一个新文件 :open file 在新窗口中打开文件 :split file 切换到下一个文件 :bn 切换到上一

[转载]VIM命令合集

Vim命令合集 http://www.cnblogs.com/softwaretesting/archive/2011/07/12/2104435.html 命令历史 以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令. 启动vim 在命令行窗口中输入以下命令即可 vim 直接启动vim vim filename 打开vim并创建名为filename的文件 文件命令 打开单个文件 vim file 同时打开多个文件 vim file1 file2 file3 ..

蓝桥杯 算法训练 ALGO-124 数字三角形

算法训练 数字三角形 时间限制:1.0s   内存限制:256.0MB 问题描述 (图3.1-1)示出了一个数字三角形. 请编一个程序计算从顶至底的某处的一条路 径,使该路径所经过的数字的总和最大. ●每一步可沿左斜线向下或右斜线向下走: ●1<三角形行数≤100: ●三角形中的数字为整数0,1,-99: . (图3.1-1) 输入格式 文件中首先读到的是三角形的行数. 接下来描述整个三角形 输出格式 最大总和(整数) 样例输入 573 88 1 02 7 4 44 5 2 6 5 样例输出 3

算法分类合集(转)

ACM 所有算法 数据结构 栈,队列,链表 哈希表,哈希数组 堆,优先队列双端队列可并堆左偏堆 二叉查找树Treap伸展树 并查集集合计数问题二分图的识别 平衡二叉树 二叉排序树 线段树一维线段树二维线段树 树状数组一维树状数组N维树状数组 字典树 后缀数组,后缀树 块状链表 哈夫曼树 桶,跳跃表 Trie树(静态建树.动态建树) AC自动机 LCA和RMQ问题 KMP算法 图论 基本图算法图广度优先遍历深度优先遍历拓扑排序割边割点强连通分量Tarjan算法双连通分量强连通分支及其缩点图的割边和

Python之路【第二十四篇】:Python学习路径及练手项目合集

Python学习路径及练手项目合集 Wayne Shi· 2 个月前 参照:https://zhuanlan.zhihu.com/p/23561159 更多文章欢迎关注专栏:学习编程. 本系列Python技术路径中包含入门知识.Python基础.Web框架.基础项目.网络编程.数据与计算.综合项目七个模块.路径中的教程将带你逐步深入,学会如何使用 Python 实现一个博客,桌面词典,微信机器人或网络安全软件等.完成本路径的基础及项目练习,将具备独立的Python开发能力. 完整的Python学

Python渗透测试工具合集

Python渗透测试工具合集 如果你热爱漏洞研究.逆向工程或者渗透测试,我强烈推荐你使用 Python 作为编程语言.它包含大量实用的库和工具, 本文会列举其中部分精华. 网络 Scapy, Scapy3k: 发送,嗅探,分析和伪造网络数据包.可用作交互式包处理程序或单独作为一个库. pypcap, Pcapy, pylibpcap: 几个不同 libpcap 捆绑的python库 libdnet: 低级网络路由,包括端口查看和以太网帧的转发 dpkt: 快速,轻量数据包创建和分析,面向基本的

win7win8 64位汇编开发环境合集安装与设置

win7win8 64位汇编开发环境合集安装与设置 下载 win7 win8  64位汇编开发环境.rar 下载地址(免积分下载) http://download.csdn.net/detail/liuchuang_mfc/9473974 打开DOSBox0.74-win32-installer.exe进行安装 将debug.exe,edit.com,link.exe,masm.exe这几个程序拷贝到d:\myassembly目录下就可以 找到你安装的路径目录下.以记事本打开文件:DOSBox

Web测试到底是在测什么(资料合集)

http://www.cnblogs.com/idotest/p/6838583.html 图片略模糊 看得清就好 Web测试, 进行抽离拆分,基本上就如上一些内容. 不管是测什么系统,什么功能,基本都差不多. 唯一区别是,一些特性 & 细节 . 今天, 老徐摘录了一些通用的测试点,根据你的实际情况,删减,即可. 正式开始之前, 说下为什么要整理这个主题. 其实,很不想整理的. 1. 没价值,网上太多,一搜大把. 2. 资料会给大家一些思维定式,有了这份大纲后,很多人会不思进取,以为已经掌握了W

Android 自定义View合集

自定义控件学习 https://github.com/GcsSloop/AndroidNote/tree/master/CustomView 小良自定义控件合集 https://github.com/Mr-XiaoLiang 自定义控件三部曲 http://blog.csdn.net/harvic880925?viewmode=contents Android 从0开始自定义控件之View基础知识与概念 http://blog.csdn.net/airsaid/article/details/5