hdu2686 多决策dp

来回可以看作从(1,1)出发到(n,n)的两条不相交的路径

//dp[k][x1][y1][x2][y2] = max(dp[k-1][x1-1][y1][x2-1][y2],dp[k-1][x1-1][y1][x2][y2-1],dp[k-1][x1][y1-1][x2-1][y2],dp[k-1][x1][y1-1][x2][y2-1])
//k为步数
//k与x1,y1有关,可以降到三维

//多决策dp
//dp[k][x1][y1][x2][y2] = max(dp[k-1][x1-1][y1][x2-1][y2],dp[k-1][x1-1][y1][x2][y2-1],dp[k-1][x1][y1-1][x2-1][y2],dp[k-1][x1][y1-1][x2][y2-1])
//k为步数
//k与x1,y1有关,可以降到三维
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
#include <stack>
#include <queue>

using namespace std;
const int inf = (1<<31)-1;
const int MAXN = 3e1+10;

int dp[2*MAXN][MAXN][MAXN];
int a[MAXN][MAXN];
int t1[2],t2[2];

int main()
{
    int n;
    while(~scanf("%d",&n)){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                scanf("%d",&a[i][j]);
            }
        }
        memset(dp,0,sizeof(dp));
       // dp[0][1][1] = a[1][1];
        for(int i=1;i<=2*n-3;i++){
            for(int j=1;j<=i+1&&j<=n-1;j++){//x1满足
                    if(i+2-j>n)continue;//y1满足
                for(int k=j+1;k<=i+1&&k<=n;k++){
                    if(i+2-k>n-1)continue;
                    t1[0] = j;
                    t1[1] = j-1;
                    t2[0] = k;
                    t2[1] = k-1;
                    for(int l=0;l<2;l++){
                        for(int r=0;r<2;r++){
                            if(t1[l]==t2[r])continue;
                            dp[i][j][k] = max(dp[i][j][k],dp[i-1][t1[l]][t2[r]]);
                        }
                    }
                    dp[i][j][k] += a[j][i+2-j]+a[k][i+2-k];
                   /* cout<<i<<" "<<j<<" "<<k<<" "<<dp[i][j][k]<<endl;
                    cout<<"debug"<<endl;*/
                }
            }
        }
        dp[2*n-2][n][n] = dp[2*n-3][n-1][n] + a[n][n];
        cout<<dp[2*n-2][n][n]+a[1][1]<<endl;
    }
    //cout << "Hello world!" << endl;
    return 0;
}

时间: 2024-12-30 03:01:41

hdu2686 多决策dp的相关文章

中矿大 C 石头剪刀布【决策DP*待看】

时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32768K,其他语言65536K64bit IO Format: %lld 题目描述 齐齐和司机正在玩剪刀石头布,不过他俩有些玩腻了,所以思考了一个全新的“剪刀石头布”的游戏. 全新的“剪刀石头布“”的胜负规则和剪刀石头布一样,每人有3种手势,分别为剪刀(scissors).石头(rock).布(paper).剪刀胜于布,布胜于石头,石头胜于剪刀,当手势相同时为平局. 齐齐可以在司机出手势后再出自己的手势,但是不能连续两局出同一种手

acm课程总结报告

本学期的选修课ACM程序设计进入尾声,首先要总结的当然是感谢老师这类的客套话,良心话是真的谢谢费老耐心认真的教学,确实学到了很多东西,这一点从数据结构这门课的学习中容易看出,轻松很多. 本学期总共学习里四个专题:第一讲贪心算法,第二讲搜索,第三讲动态规划以及现在正在 努力做的图.下面我将以这四个专题为基础分别讲解ACM中所获得知识内容,感悟. 专题一贪心算法. 贪心算法包括计算活动安排的贪心算法,背包问题,删数问题.他的理论基础有三点,1,在问题的每一步选择中都采取在当前状态下最好或者最优的选择

博弈论题目总结(一)——组合游戏

人类的本质是什么呢?复读机?鸽子? 博弈问题是很有意思的一类题目 我讲的可能不是很明白,但题目都不难建议自己思考 组合游戏的特点: 1.两个人博弈,轮流做出最优决策 2.玩家在每个时刻做出的决策都是能预测到的,是一个确定的集合 3.每种状态可能有多种方式到达,但同一种状态不能在一次游戏中重复到达,且没有平局的情况 4.只要能进行决策,就一定要决策,不能跳过这个回合 SG组合游戏 我们把每种状态抽象成一个点,在起点有一颗棋子,两个人选取最优策略轮流对这颗棋子进行移动,最后不能移动棋子的人失败 显然

动态规划几种优化方式

动态规划确实是很考验思维的一类题目,有时候想到设计状态和状态转移方程还不够,还得想到它的优化方式.有的优化方式比较显然,更多的并不显然而且要依靠其他知识和外部数据结构.尽管十分灵活,但是最重要的其实也只有几种,总结经验能让我们更好地应对这个问题. 墙裂推荐博客:https://www.cnblogs.com/flashhu/p/9480669.html 蒟蒻博主也没有什么新见解啦,更多是对上面博客的一个题目集合题解.(这部分知识对博主来说还是有点难,陆陆续续学习更新吧.) 前缀和优化: 洛谷P2

HYSBZ 1010 玩具装箱toy (决策单调DP)

题意: 有n个玩具,要将它们分为若干组,玩具同宽同高,但长度C可能不同.给出n个玩具的摆放顺序,连续的任意多个玩具都可以成为一组.区间[i,j]成为一组的费用是cost=(j-i+Sigma(Ck)-L)2且i<=k<=j.给定n和L和每个玩具的长度,问分组后费用总和是多少? (n<=5*104). 思路: 注:费用并非是直线的函数,每个组的总长度+玩具数量越接近L越好. 转移方程:dp[i]=min( dp[j]+(sum[i]-sum[j]+i-j+1-L)2  ).sum[i]表示

1D/1D优化dp之利用决策点的凸性优化

关于dp的优化之前做过一些简单的利用优先队列或者单调队列维护一个值就ok了,但有时候给出的方程很难直接用单调队列维护,需要转化一下思路. 这种优化方式利用数形结合,根据比较斜率来抛去一些非最优解,能将方程优化到线性,但对于一些更难得题目就需要一些数据结构维护,我暂时没接触过. 先用一道简单的题目来入手,hdu 3507 http://acm.hdu.edu.cn/showproblem.php?pid=3507 Print Article Time Limit: 9000/3000 MS (Ja

DP + 斜率优化 / 决策单调性 --- [HNOI2008]玩具装箱TOY

[HNOI2008]玩具装箱TOY 题目描述: P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京. 他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中. P教授有编号为\(1......N\)的\(N\)件玩具,第\(i\)件玩具经过压缩后变成一维长度为\(C_{i}\). 为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的. 同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物, 形式地说如果将第\(i\)件玩

题解——[NOI2009]诗人小G 决策单调性优化DP

第一次写这种二分来优化决策单调性的问题.... 调了好久,,,各种细节问题 显然有DP方程: f[i]=min(f[j] + qpow(abs(sum[i] - sum[j] - L - 1))); 其中f[i]代表到了第i个句子的最小答案 qpow用于处理^p sum为前缀和 (同时为了处理句子之间的空格问题,我们在统计前缀和的时候就默认在句子后面加一个空格, 然后在计算的时候,由于每一行只有最后一个不用加空格,直接减掉这个多加的空格即可获得正确长度) 首先我们可以打表发现是满足决策单调性的,

决策单调性优化dp

决策单调性: 对于一些dp方程,经过一系列的猜想和证明,可以得出,所有取的最优解的转移点(即决策点)位置是单调递增的. 即:假设f[i]=min(f[j]+b[j]) (j<i) 并且,对于任意f[i]的决策点g[i],总有f[i+1]的决策点g[i+1]>=g[i](或者<=g[i]) 那么,这个方程就具备决策单调性. 这个有什么用吗? 不懂具体优化方法的话确实也没有什么用.可能还是n^2的.只不过范围可能少了一些. 经典入门例题: Description: [POI2011]Ligh