zoukankan      html  css  js  c++  java
  • [TJOI2015]组合数学

    题目描述

    为了提高智商,ZJY开始学习组合数学。某一天她解决了这样一个问题:给一个网格图,其中某些格子有财宝。每次从左上角出发,只能往右或下走。问至少要走几次才可能把财宝全捡完。

    但是她还不知足,想到了这个问题的一个变形:假设每个格子中有好多块财宝,而每一次经过一个格子至多只能捡走一块财宝,其他条件不变,至少要走几次才可能把财宝全捡完?

    这次她不会做了,你能帮帮她吗?

    输入输出格式

    输入格式:

    第一行为一个正整数t,表示数据组数

    每组数据的第一行是两个正整数n和m,表示这个网格图有n行m列。

    接下来n行,每行m个非负整数,表示这个格子中的财宝数量(0表示没有财宝)。

    输出格式:

    对于每组数据,输出一个整数,表示至少走的次数。

    输入输出样例

    输入样例#1: 复制
    1
    3 3
    0 1 5
    5 0 0
    1 0 0
    输出样例#1: 复制
    10

    说明

    数据范围

    对于30%的数据,n≤5.m≤5,每个格子中的财宝数不超过5块。

    对于50%的数据,n≤100,m≤100,每个格子中的财宝数不超过1000块

    对于100%的数据,n≤1000,m≤1000,每个格子中的财宝不超过10^6块

    Dilworth定理,最小链覆盖=最大反链长度

    所以转化为反链,使用DP求最大的反链

    反链即为右上的点连向左下

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<cstring>
     5 #include<algorithm>
     6 using namespace std;
     7 typedef long long lol;
     8 lol f[1005][1005],a[1005][1005];
     9 int n,m;
    10 int main()
    11 {int i,j,T;
    12 cin>>T;
    13     while (T--)
    14     {
    15         memset(f,0,sizeof(f));
    16         cin>>n>>m;
    17         for (i=1;i<=n;i++)
    18           for (j=1;j<=m;j++)
    19             scanf("%lld",&a[i][j]);
    20         for (i=1;i<=n;i++)
    21         {
    22             for (j=m;j>=1;j--)
    23             f[i][j]=max(f[i-1][j+1]+a[i][j],max(f[i-1][j],f[i][j+1]));
    24         }
    25         cout<<f[n][1]<<endl;
    26     }
    27 }
  • 相关阅读:
    SpringBoot项目中,表单的验证操作
    微信点餐系统(十)-卖家端通用功能和上下架
    IDEA中Springboot静态文件加载(热部署)
    微信点餐系统(九)-卖家端订单
    微信点餐系统(八)-微信支付与退款
    MyBatis的生命周期
    关于flexjson将json转为javabean的使用
    Spring MVC中前端控制器拦截问题
    springmvc实现文件上传
    springmvc拦截器实现用户登录权限验证
  • 原文地址:https://www.cnblogs.com/Y-E-T-I/p/8964101.html
Copyright © 2011-2022 走看看