Luogu【P1130】红牌(DP)

欧拉 本蒟蒻第一个自己想出来的DP题

请移步题目链接

调了半天。i从1到n,j从1到m。

f[i][j]表示的是第i道工序在第j个小组办完所花的最短时间。

因为要用到上一个状态,而上一个状态要么是同一小组,要么是上一个小组

所以j的做法跟题目是反着的

so转移方程

f[i][j]=min(f[i-1][j],f[i-1][j==1?n:j-1]);
f[i][j]+=mp[j][i];

然后就找到完成所有工序耗时最短的组就行啦

#include<cstdio>
#include<cstdlib>
#include<cctype>
#include<cstring>

int mp[2010][2010];
int f[2010][2010];

inline long long read(){
    long long num=0,f=1;
    char ch=getchar();
    while(!isdigit(ch)){
        if(ch==‘-‘)    f=-1;
        ch=getchar();
    }
    while(isdigit(ch)){
        num=(num<<1)+(num<<3)+ch-‘0‘;
        ch=getchar();
    }
    return num*f;
}

inline long long min(long long a,long long b){    return a<b?a:b;    }
int ans=0x7fffffff;

int main(){
    memset(f,127,sizeof(f));
    int m=read(),n=read();
    for(int i=1;i<=n;++i){
        f[0][i]=0;
        for(int j=1;j<=m;++j)    mp[i][j]=read();
    }
    for(int i=1;i<=m;++i){
        for(int j=1;j<=n;++j){
            f[i][j]=min(f[i-1][j],f[i-1][j==1?n:j-1]);
            f[i][j]+=mp[j][i];
            //printf("%d ",f[i][j]);
        }
        //printf("\n");
    }

    for(int i=1;i<=n;++i)    ans=min(ans,f[m][i]);
    printf("%d",ans);
    return 0;
}
时间: 2024-10-13 12:25:58

Luogu【P1130】红牌(DP)的相关文章

P1130 红牌

P1130 红牌 某地临时居民想获得长期居住权就必须申请拿到红牌.获得红牌的过程是相当复杂 ,一共包括N个步骤.每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件.为了加快进程,每一步政府都派了M个工作人员来检查材料.不幸的是,并不是每一个工作人员效率都很高.尽管如此,为了体现"公开政府"的政策,政府部门把每一个工作人员的处理一个申请所花天数都对外界公开. 为了防止所有申请人都到效率高的工作人员去申请.这M*N个工作人员被分成M个小组.每一组在每一步都有一个工作人员.申请

洛谷 P1130 红牌

P1130 红牌 题目描述 某地临时居民想获得长期居住权就必须申请拿到红牌.获得红牌的过程是相当复杂 ,一共包括N个步骤.每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件.为了加快进程,每一步政府都派了M个工作人员来检查材料.不幸的是,并不是每一个工作人员效率都很高.尽管如此,为了体现“公开政府”的政策,政府部门把每一个工作人员的处理一个申请所花天数都对外界公开. 为了防止所有申请人都到效率高的工作人员去申请.这M*N个工作人员被分成M个小组.每一组在每一步都有一个工作人员.申请

luogu P1659 养猪 dp 好理解

P1659 养猪 题目描述 你有一个猪圈,有N头猪,每天你最多可以杀一头猪卖钱,获益就是猪的体重.但是每过一天每头猪的体重都会下降P[i](当然,如果猪体重<=0了,自然获利为0),问K天内你的最大获利. 输入输出格式 输入格式: 第一行两个数N.K: 第二行N个数,表示猪的初始重量A[i]: 第三行N个数表示P[i]. [数据规模] 对于20%的数据,满足1≤N≤20; 对于100%的数据,满足1≤N≤1000,初始重量≤10^5. 输出格式: 一行一个数表示最大获利. 输入输出样例 输入样例

73: luogu 2014 树形dp

$des$ 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门课有个学分,每门课有一门或没有直接先修课(若课程a是课程b的先修课即只有学完了课程a,才能学习课程b).一个学生要从这些课程里选择M门课程学习,问他能获得的最大学分是多少? $des$ 建出完整的树后 dp #include <bits/stdc++.h> using namespace std; #define R

Luogu P1052 过河 DP

复习复习DP...都忘了QAQ... 好了这道题我其实是看题解才会的... 方程 f[i]=min(f[i-j]+v[i]) v[i]表示i是不是石头 s<=j<=t 路径压缩引用一下证明From [email protected]_Hu #include<cstdio> #include<iostream> #define R register int #include<algorithm> #define R register int const int

【题解】Luogu P3584 LAS dp

一个状态超多的dp 考虑对食物转移,设f[][0/1/2/3]表示不被选/被左吃/被右吃/被两边吃 只要考虑全每一种状态即可 dp void dp(int x,int y){ if(~f[x][2]&&a[x]>=a[y])f[y][0]=2; else if(~f[x][3]&&a[x]>=a[y]*2)f[y][0]=3; if(~f[x][0]&&a[x]<=a[y])f[y][1]=0; else if(~f[x][1]&&

HNOI2018 道路

Luogu 真·普及 DP 令 \(f_{x,y,z}\) 为在 \(i\) 点,有 \(y\) 条公路没修,有 \(z\) 条铁路没修 \[f_{x,y,z}=\max{f_{s_i,y+1,z}+f_{t_i,y,z},f_{s_i,y,z}+f_{s_i,y,z+1}}\] 由于树的高是保证的,所以并不会被卡空间 可以先把 \(dfn\) 跑出来后倒着推,也可以直接 \(dfs\) 注意下细节 #include <iostream> #include <cstdio> #in

[luogu P2170] 选学霸(并查集+dp)

题目传送门:https://www.luogu.org/problem/show?pid=2170 题目描述 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一部分没有,同学们就会抗议.所以老师想请你帮他求出他该选多少学霸,才能既不让同学们抗议,又与原来的M尽可能接近 输入输出格式 输入格式: 第一行,三个正整数N,M,K. 第2...K行,每行2个数,表示一对实力相当的人的编号(编号为1-N) 输出格式: 一行,表示既不让同学们抗议,又与原来的M尽可能接

[luogu]P1800 software_NOI导刊2010提高(06)[DP][二分答案]

[luogu]P1800 software_NOI导刊2010提高(06) 题目描述 一个软件开发公司同时要开发两个软件,并且要同时交付给用户,现在公司为了尽快完成这一任务,将每个软件划分成m个模块,由公司里的技术人员分工完成,每个技术人员完成同一软件的不同模块的所用的天数是相同的,并且是已知的,但完成不同软件的一个模块的时间是不同的,每个技术人员在同一时刻只能做一个模块,一个模块只能由一个人独立完成而不能由多人协同完成.一个技术人员在整个开发期内完成一个模块以后可以接着做任一软件的任一模块.写