【题解】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]&&a[x]<=a[y]*2)f[y][1]=1;
    if(~f[x][2]&&a[x]*2>=a[y])f[y][2]=2;
    else if(~f[x][3]&&a[x]>=a[y])f[y][2]=3;
    if(~f[x][0]&&a[x]*2<=a[y])f[y][3]=0;
    else if(~f[x][1]&&a[x]<=a[y])f[y][3]=1;
}

code

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 namespace gengyf{
 4 #define ll long long
 5 const int mod=1e5+3;
 6 const int maxn=1e6+10;
 7 inline int read(){
 8     int x=0,f=1;
 9     char c=getchar();
10     while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
11     while(c>=‘0‘&&c<=‘9‘){x=(x*10)+c-‘0‘;c=getchar();}
12     return x*f;
13 }
14 int f[maxn][4],n,a[maxn],ans[maxn],fl;
15 void dp(int x,int y){
16     if(~f[x][2]&&a[x]>=a[y])f[y][0]=2;
17     else if(~f[x][3]&&a[x]>=a[y]*2)f[y][0]=3;
18     if(~f[x][0]&&a[x]<=a[y])f[y][1]=0;
19     else if(~f[x][1]&&a[x]<=a[y]*2)f[y][1]=1;
20     if(~f[x][2]&&a[x]*2>=a[y])f[y][2]=2;
21     else if(~f[x][3]&&a[x]>=a[y])f[y][2]=3;
22     if(~f[x][0]&&a[x]*2<=a[y])f[y][3]=0;
23     else if(~f[x][1]&&a[x]<=a[y])f[y][3]=1;
24 }
25 int main(){
26     n=read();
27     for(int i=1;i<=n;i++){
28         a[i]=read();
29     }
30     for(int s=0;s<4;s++){
31         memset(f,-1,sizeof(f));
32         f[1][s]=4;
33         for(int i=2;i<=n;i++)dp(i-1,i);
34         dp(n,1);
35         if(f[1][s]<4){
36             int k=f[1][s];
37             for(int i=n;i;i--){
38                 if(k==1||k==3)ans[(i-2+n)%n+1]=i;
39                 if(k==2||k==3)ans[i]=i;
40                 k=f[i][k];
41             }
42             for(int i=1;i<=n;i++){
43                 printf("%d ",ans[i]);
44             }
45             fl=1;break;
46         }
47     }
48     if(!fl)puts("NIE");
49     return 0;
50 }
51 }
52 signed main(){
53   gengyf::main();
54   return 0;
55 }

原文地址:https://www.cnblogs.com/gengyf/p/11640741.html

时间: 2024-11-05 11:35:16

【题解】Luogu P3584 LAS dp的相关文章

题解 luogu P1850 【换教室】

题解 luogu P1850 [换教室] 时间:2019.8.6 一晚上(约 3.5h 写完) 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 \(2n\) 节课程安排在 \(n\) 个时间段上.在第 \(i\)(\(1 \leq i \leq n\))个时间段上,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先被安排在教室 \(c_i\) 上课,而另一节课程在教室 \(d_i\) 进行. 在不提交任何申请的情况下,学生们需要

题解 luogu P5021 【赛道修建】

题解 luogu P5021 [赛道修建] 时间:2019.8.9 20:40 时间:2019.8.12 题目描述 C 城将要举办一系列的赛车比赛.在比赛前,需要在城内修建 \(m\) 条赛道. C 城一共有 \(n\) 个路口,这些路口编号为 \(1,2,\dots,n\),有 \(n-1\) 条适合于修建赛道的双向通行的道路,每条道路连接着两个路口.其中,第 \(i\) 条道路连接的两个路口编号为 \(a_i\) 和 \(b_i\),该道路的长度为 \(l_i\).借助这 \(n-1\) 条

【题解】剪纸条(dp)

[题解]剪纸条(dp) HRBUST - 1828 网上搜不到题解?那我就来写一篇吧哈哈哈 最优化问题先考虑\(dp\),设\(dp(i)\)表示将前\(i\)个字符(包括\(i\))分割成不相交的回文子串的最小数目 直接模拟题意转移即可.初始化写在里面了,\(dp(i)=i\) \[ dp(i)=\min\{i,dp(j-1)\} \] 其中\(S[j\dots i]\)是一个回文串,\(O(n^2)\)预处理回文串即可,注意偶回文串和奇回文串. 刚开始想太多,这道题.以后遇最优化的题一定要花

【NOI2015】寿司晚会 题解(状压DP)

[问题描述] 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n?1 种不同的寿司,编号 1,2,3,?, n?1, 其中第 i 种寿司的美味度为 i+1  (即寿司的美味度为从 2 到 n ). 现在小 G 和小 W 希望每人选一些寿司种类来品尝,他们规定一种品尝方案 为不和谐的当且仅当:小 G 品尝的寿司种类中存在一种美味度为 x 的寿司,小 W 品尝的寿司中存在一种美味度为 y

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

理想乡题解 (线段树优化dp)

题面 思路概述 首先,不难想到本题可以用动态规划来解,这里就省略是如何想到动态规划的了. 转移方程 f[i]=min(f[j]+1)(max(i-m,0)<=j<i 且j符合士兵限定) 注意要用 max(i-m,0)以防止越界 我们先用两个数组sl,sa分别统计1~i个士兵中有多少个Lencer和Archer 然后在max(i-m,0)中寻找符合条件的j (1).两种士兵相差不超过k. 这个好说abs((sl[i]-sl[j])-(sa[i]-sa[j]))<=k 不要忘了第二种情况!!

题解 Luogu P2499: [SDOI2012]象棋

关于这道题, 我们可以发现移动顺序不会改变答案, 具体来说, 我们有以下引理成立: 对于一个移动过程中的任意一个移动, 若其到达的位置上有一个棋子, 则该方案要么不能将所有棋子移动到最终位置, 要么可以通过改变顺序使这一次移动合法 证明: 考虑到达位置上的那个棋子, 如果它没有到达最终位置, 则我们考虑将该棋子移至下一步, 如果下一步还有没有到达最终位置的棋子, 则也移动它 否则直接调换这两个棋子的移动顺序即可 好的我们去除了题目中的要求: 「移动过程中不能出现多颗棋子同时在某一格的情况」, 接

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. 输出格式: 一行一个数表示最大获利. 输入输出样例 输入样例

BZOJ 1087 题解【状压DP】

1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3112  Solved: 1816[Submit][Status][Discuss] Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. Input 只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K &