dp【二维动归】 jzojp1295

一道比较典型的二维动归题目

但我在打的时候没有推出来简洁的动归表达式0.0,有点搜索的味道,所有时间花的有点多

但只要优化一下就好了

#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
int num[3000][3000];
int hh[3000][3000];
int ll[3000][3000];
int f[3000][3000];
int ff[3000][3000];
int main()
{
    //freopen("a.in","r",stdin);
    int m,n;
    cin>>m>>n;
    for(int i=1;i<=m;i++)
        for(int u=1;u<=n;u++)
        {
            cin>>num[i][u];
            hh[i][u]=hh[i][u-1]+num[i][u];
            ll[i][u]=ll[i-1][u]+num[i][u];
            ff[i][u]=f[i][u]=num[i][u];
        }
        int maxx=0;
    for(int i=1;i<=m;i++)
        for(int u=1;u<=n;u++)
        {
            if(num[i][u]==0){f[i][u]==0;continue;}
            int w=f[i-1][u-1];
            int ans=0;
            for(int k=w;k>=0;k--)
            {
                if(hh[i][u]-hh[i][u-1-k]==1)
                    if(ll[i][u]-ll[i-k-1][u]==1)
                    {
                        ans=k;
                        break;
                    }
            }
            f[i][u]+=ans;
            maxx=max(f[i][u],maxx);
        }
    for(int i=1;i<=m;i++)
        for(int u=1;u<=n;u++)
        {
            int ans=0;
            if(num[i][u]==0){ff[i][u]=0;continue;}
            int w=ff[i-1][u+1];
            for(int k=w;w>=1;k--)
            {
                if(hh[i][u+k]-hh[i][u]==0)
                    if(ll[i][u]-ll[i-k-1][u]==1)
                    {ans=k;break;}
            }
            ff[i][u]+=ans;
            maxx=max(ff[i][u],maxx);
        }
        cout<<maxx<<endl;
    return 0;
}
时间: 2024-11-05 17:18:58

dp【二维动归】 jzojp1295的相关文章

hdu6078 Wavel Sequence dp+二维树状数组

//#pragma comment(linker, "/STACK:102400000,102400000") /** 题目:hdu6078 Wavel Sequence 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6078 题意:给定a序列和b序列.从a中取一个子序列x(数的位置顺序保持不变),子序列每个数满足a1<a2>a3<a4>a5<a6... 波浪形 从b中取相同长度的子序列y,也满足波浪形. 如果x

bzoj 3594 [Scoi2014]方伯伯的玉米田(DP+二维BIT)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3594 [题意] 给定一个n个数的序列,有K次将一个区间内的数加1的机会,问最长不下降子序列. [思路] 首先知道每次加1一个区间为[i,n]肯定不会差. 设f[i][j]为前i个数,还有j次机会的LIS,则有转移式: f[i][j] = max{ f[a][b],h[a]+b<=h[i]+j } 则可以用二维BIT加速方程转移. [代码] 1 #include<set> 2

UVa 10285 Longest Run on a Snowboard(DP 二维最长递减子序列)

题意  输入一个城市的滑雪地图  你可以从高的地方滑到伤下左右低的地方  求这个城市的最长滑雪线路长度   即在一个矩阵中找出最长递减连续序列 令d[i][j]为以格子map(i,j)为起点的最长序列   则有状态转移方程d[i][j]=max{d[a][b]}+1  a,b为与i,j相邻且值比i,j小的所有点 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #def

Max Sum Plus Plus HDU - 1024 基础dp 二维变一维的过程,有点难想

/* dp[i][j]=max(dp[i][j-1]+a[j],max(dp[i-1][k])+a[j]) (0<k<j) dp[i][j-1]+a[j]表示的是前j-1分成i组,第j个必须放在前一组里面. max( dp[i-1][k] ) + a[j] )表示的前(0<k<j)分成i-1组,第j个单独分成一组. */ #include <iostream> #include <cstdio> #include <cstring> #inclu

HDU 1505 City Game (hdu1506 dp二维加强版)

F - City Game Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1505 Appoint description: Description Bob is a strategy game programming specialist. In his new city building game the gaming enviro

hdu1081 dp 二维矩阵求最大连续子矩阵

O(n^3) 必然要讨论每种情况,每行必然要讨论0~0,0~1,0~2,...i~j(0<=i<=j<n)的情况,每行的每种情况都是一个确定的数值,则把n个[f(i,j)]可以看作求一个一维的最长连续子序列,这样讨论每种i,j分部情况,求出对应的一维最长子序列,这些子序列取max,即为题目所要求的最大连续子矩阵 其实我们可以再输入的时候,就把a[i][j]确定为第i行前j个数之和,即为0~j的分步,这样我们以后讨论序列start~end时,只要a[k][end]-a[k][start-1

CF #355div2 D 宝藏与钥匙 dp 二维数组智商题

D. Vanya and Treasure time limit per test 1.5 seconds memory limit per test 256 megabytes input standard input output standard output Vanya is in the palace that can be represented as a grid n × m. Each room contains a single chest, an the room locat

bzoj1218: [HNOI2003]激光炸弹(DP二维前缀和)

1218: [HNOI2003]激光炸弹 题目:传送门 题解: 一道经典题目啊... 为了更好的操作...把整个坐标系向右上角移动,从(1,1)开始 那么f[i][j]统计一下以(i,j)作为右上角,以(1,1)作为左下角所组成的矩阵里面的价值和 不难发现,爆炸范围为R*R,且刚好在边上的点不会被摧毁,那么有效矩阵的四条边上肯定就只有R个点 那么ans=max(ans,f[i][j]+f[i-r][j-r]-f[i][j-r]-f[i-r][j]); 代码: 1 #include<cstdio>

hdu3669之二维斜率DP

Cross the Wall Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 327680/327680 K (Java/Others) Total Submission(s): 4176    Accepted Submission(s): 748 Problem Description "Across the Great Wall, we can reach every corner in the world!" No