首页 > 其他分享 >POJ--1179 Polygon(区间DP)

POJ--1179 Polygon(区间DP)

时间:2024-02-10 22:45:29浏览次数:35  
标签:oper Polygon min -- max 1179 quad cases dp

记录
22:01 2024-2-10

http://poj.org/problem?id=1179

区间DP问题。区间DP问题可能需要注意的点就是是根据区间长度来计算的,随着迭代区间长度不断增加,结果也就计算出来了

这种“任意选择一个位置断开, 复制形成2倍长度的链” 的方法,是解决DP中环形结构的常用手段之一

因此读入数据选择了断开第一条边然后复制成2倍长度的链,这样就把问题变成了非环问题,通过区间DP计算出结果

注意这里使用的是\(oper[k+1]\)

\[dp\_max[l][r] = \begin{cases} \max_{l \le k < r}{ \max \begin{cases} dp\_max[l][k] \quad oper \quad dp\_max[k+1][r] \\ dp\_min[l][k] \quad * \quad dp\_min[k+1][r] \\ dp\_max[l][k] \quad * \quad dp\_min[k+1][r] \\ dp\_min[l][k] \quad * \quad dp\_max[k+1][r] \\ \end{cases} } \end{cases} \]

\[dp\_min[l][r] = \begin{cases} \min_{l \le k < r}{ \min \begin{cases} dp\_min[l][k] \quad oper \quad dp\_min[k+1][r] \\ dp\_max[l][k] \quad * \quad dp\_max[k+1][r] \\ dp\_max[l][k] \quad * \quad dp\_min[k+1][r] \\ dp\_min[l][k] \quad * \quad dp\_max[k+1][r] \\ \end{cases} } \end{cases} \]

点击查看代码
#include<iostream>
#include<vector>
#include<stdio.h>
#include<string.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 55;

int value[MAXN * 2], dp_max[MAXN * 2][MAXN * 2], dp_min[MAXN * 2][MAXN * 2];
char oper[MAXN * 2];

int main() {
    // 0xcf 11001111 ~x + 1 = 00110001 值为 -31
    // 0x3f 00111111
    // -0x3f 11000001 0xc1
    memset(dp_max, 0xcf, sizeof(dp_max));
    memset(dp_min, 0x3f, sizeof(dp_min));
    int n;
    cin >> n;
    for(int i = 1; i <= n; i++) {
        cin >> oper[i] >> value[i];
        oper[i + n] = oper[i];
        value[i + n] = value[i];
    }

    for(int i = 1; i <= 2 * n; i++) dp_max[i][i] = dp_min[i][i] = value[i];
    for(int len = 2; len <= n; len++) {
        for(int l = 1; l + len - 1 <= n * 2 ; l++) {
            int r = l + len - 1;
            for(int k = l; k < r; k++) {
                // [l,k] oper[k + 1] [k,r]
                if(oper[k + 1] == 't') {
                    dp_max[l][r] = max(dp_max[l][r], dp_max[l][k] + dp_max[k+1][r]);
                    dp_min[l][r] = min(dp_min[l][r], dp_min[l][k] + dp_min[k+1][r]);
                } else {
                    dp_max[l][r] = max(dp_max[l][r], dp_max[l][k] * dp_max[k+1][r]);
                    dp_max[l][r] = max(dp_max[l][r], dp_min[l][k] * dp_min[k+1][r]);
                    dp_max[l][r] = max(dp_max[l][r], dp_max[l][k] * dp_min[k+1][r]);
                    dp_max[l][r] = max(dp_max[l][r], dp_min[l][k] * dp_max[k+1][r]);

                    dp_min[l][r] = min(dp_min[l][r], dp_min[l][k] * dp_min[k+1][r]);
                    dp_min[l][r] = min(dp_min[l][r], dp_max[l][k] * dp_max[k+1][r]);
                    dp_min[l][r] = min(dp_min[l][r], dp_max[l][k] * dp_min[k+1][r]);
                    dp_min[l][r] = min(dp_min[l][r], dp_min[l][k] * dp_max[k+1][r]);
                }
            }
        }
    }
    int result = -INF;
    for(int i = 1; i <= n; i++) {
        if(dp_max[i][i+n-1] > result) {
            result = dp_max[i][i+n-1];
        }
    }
    cout << result << endl;
    for(int i = 1; i <= n; i++) {
        if(dp_max[i][i+n-1] == result)
            cout << i << " ";
    }
}

标签:oper,Polygon,min,--,max,1179,quad,cases,dp
From: https://www.cnblogs.com/57one/p/18013066

相关文章

  • [spring] spring学习笔记(3): 通过注解实现依赖注入
    注解Annotation注解是代码中的一种特殊标记,java中的格式为@Anno_Name(pro=value)注解可以被使用在方法,类和属性上;在spring中,使用注解来实现自动装配,可以简化Bean的配置,基本步骤如下:引入依赖开启组件扫描使用注解定义Bean注入依赖引入依赖在新建的spring项目下的src/main......
  • P4933 大师
    原题链接题解对于任意剩余塔,都可以表示为以某个塔结尾的等差数列code#include<bits/stdc++.h>usingnamespacestd;inth[1005]={0};intdp[1005][40005]={0};//代表以塔i结尾,等差为j的种类inthaxi(intx){returnx+20001;}intmain(){intn;cin>>n;......
  • archlinux flutter开发踩坑
    archlinuxflutter开发踩坑archlinux是个好东西,但是开发flutter坑不少。2023年5月我配置了flutter,后来用得不多,23年11月还尝试过但是失败,最近又要使用,就来解决下。20230210今天需要写一个手机app,突然发现构建不出来了,报错>Failedtocreateparentdirectory'/opt/flutter......
  • C#使用MiniExcel导入导出数据到Excel/CSV文件
    MiniExcel简介简单、高效避免OOM的.NET处理Excel查、写、填充数据工具。目前主流框架大多需要将数据全载入到内存方便操作,但这会导致内存消耗问题,MiniExcel尝试以Stream角度写底层算法逻辑,能让原本1000多MB占用降低到几MB,避免内存不够情况。特点:低内存耗用,避免OOM、频繁......
  • AtCoder Beginner Contest 340
    A-ArithmeticProgression(abc340A)题目大意给定等差数列的首项、末项、公差。输出这个等差数列。解题思路从首相依次累加公差到末项即可。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){ios::sync_with_std......
  • Crypto( 12 )
    easy_crypto下载好打开,有点像base64,搜了一下并不是,在网页上看见若base64出现乱码就用rot13之后就没思路了结果要用base32base64base85flag{so_easy!}下面是有关base知识点https://www.cnblogs.com/ruoli-s/p/14206145.htmlJJ用与佛论禅在线工具base100......
  • SIP NAT ALG
    SIPNATALG VoIP(VoiceonIP),从字面上看就是语音跑在IP网络上。具体来说就是将电话业务与web浏览,email等其它数据应用一样,承载在IP网络(例如互联网)上,将其语音数据以IP包的形式传输。与主流的web应用相比,VoIP具有以下特点媒体(内容数据)的传输是双向对称,实时的,基于单独的实时传......
  • ABC340
    E我们可以知道每一个点在每一轮加多少,具体如下:假如现在操作的点的为\(k\)。那么所有的数都至少会加\(\dfrac{A_k}{n}\)。但是肯定有剩的,剩了\(A_k\modn\)。很明显,\(A_k\modn\)会分给接下来的\(A_k\modn\)个数。这样我们就可以知道每个点每轮加多少了。然后用线段......
  • 第 7章 Python 爬虫框架 Scrapy(上)
    第7章Python爬虫框架Scrapy(上)编写爬虫可以看成行军打仗,基本的角色有两个:士兵和将军,士兵冲锋陷阵,而将军更多地是调兵遣将。框架就像一个将军,里面包含了爬虫的全部流程、异常处理和任务调度等。除了可以让我们少写一些烦琐的代码,学习框架还可以学到编程思想和提升编程能力。Pyt......
  • 各种bin在多种情况下漏洞利用的理论和实践
    先看一下main_arena中的大致结构:largebinattck此图不完全正确,其中largebin里的chunk如果是小组中最前面的那个chunk,并且大组中只有一个小组,bk_nextsize和fd_nextsize就都指向自己,且链表当中最后一个chunk的bk和最前面的chunk的fd指针指向头部,如果是小组中非最前面的chunk,则b......