首页 > 其他分享 >赛克 1530(环形dp)

赛克 1530(环形dp)

时间:2024-05-26 17:24:03浏览次数:20  
标签:cout 法力 int 个卡牌 1530 赛克 dp define

赛氪OJ-专注于算法竞赛的在线评测系统 (saikr.com)

枚举第一张卡片是由法力值降低还是法力值上升得到的,一共有4种情况,d[i][j][0]表示第i个卡牌选第j个法力值并且上一个卡牌的法力值大于j的所获得的前i个卡牌的最大运气值;d[i][j][1]表示第i个卡牌选第j个法力值并且上一个卡牌的法力值小于j的所获得的前i个卡牌的最大运气值。

  1 #define IO std::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
  2 #define bug(x) cout<<#x<<" is "<<x<<endl
  3 #include <bits/stdc++.h>
  4 #define iter ::iterator
  5 using namespace  std;
  6 typedef long long ll;
  7 typedef pair<int,int>P;
  8 #define pb push_back
  9 #define mk make_pair
 10 #define se second
 11 #define fi first
 12 // #define rs o*2+1
 13 // #define ls o*2
 14 const int N=1e5+5;
 15 int n;
 16 int a[N][4];
 17 ll d[N][4][2];
 18 int vis[N][4];
 19 int cnt=0;
 20 void init(){
 21     for(int i=1;i<=n;i++){
 22         for(int j=1;j<=3;j++){
 23             d[i][j][0]=0;
 24             d[i][j][1]=0;
 25         }
 26     }
 27 }
 28 int main(){
 29     IO;
 30     cin>>n;
 31         
 32     for(int i=1;i<=n;i++){
 33         for(int j=1;j<=3;j++)cin>>a[i][j];
 34     }
 35     
 36     d[1][2][0]=a[1][2];
 37     for(int i=2;i<=n;i++){
 38         if(i==n){
 39             for(int j=1;j<=3;j++){
 40                 for(int k=1;k<j;k++){
 41                     d[i][j][1]=max(d[i][j][1],d[i-1][k][0]+a[i][j]);
 42                 }
 43             }
 44             continue;
 45         }
 46         for(int j=1;j<=3;j++){
 47             for(int k=j+1;k<=3;k++){
 48                 d[i][j][0]=max(d[i][j][0],d[i-1][k][1]+a[i][j]);
 49             }
 50             for(int k=1;k<j;k++){
 51                 d[i][j][1]=max(d[i][j][1],d[i-1][k][0]+a[i][j]);
 52             }
 53         }
 54     }
 55     ll ans=d[n][3][1];
 56 
 57     init();
 58     d[1][1][0]=a[1][1];
 59     for(int i=2;i<=n;i++){
 60         if(i==n){
 61             for(int j=1;j<=3;j++){
 62                 for(int k=1;k<j;k++){
 63                     d[i][j][1]=max(d[i][j][1],d[i-1][k][0]+a[i][j]);
 64                 }
 65             }
 66             continue;
 67         }
 68         for(int j=1;j<=3;j++){
 69             for(int k=j+1;k<=3;k++){
 70                 d[i][j][0]=max(d[i][j][0],d[i-1][k][1]+a[i][j]);
 71             }
 72             for(int k=1;k<j;k++){
 73                 d[i][j][1]=max(d[i][j][1],d[i-1][k][0]+a[i][j]);
 74             }
 75         }
 76     }
 77     
 78     ans=max(ans,d[n][3][1]);
 79     ans=max(ans,d[n][2][1]);
 80 
 81     init();
 82     d[1][2][1]=a[1][2];
 83     for(int i=2;i<=n;i++){
 84         if(i==n){
 85             for(int j=1;j<=3;j++){
 86                 for(int k=j+1;k<=3;k++){
 87                     d[i][j][0]=max(d[i][j][0],d[i-1][k][1]+a[i][j]);
 88                 }
 89             }
 90             continue;
 91         }
 92         for(int j=1;j<=3;j++){
 93             for(int k=j+1;k<=3;k++){
 94                 d[i][j][0]=max(d[i][j][0],d[i-1][k][1]+a[i][j]);
 95             }
 96             for(int k=1;k<j;k++){
 97                 d[i][j][1]=max(d[i][j][1],d[i-1][k][0]+a[i][j]);
 98             }
 99         }
100     }
101     ans=max(ans,d[n][1][0]);
102 
103     init();
104     d[1][3][1]=a[1][3];
105     for(int i=2;i<=n;i++){
106         if(i==n){
107             for(int j=1;j<=3;j++){
108                 for(int k=j+1;k<=3;k++){
109                     d[i][j][0]=max(d[i][j][0],d[i-1][k][1]+a[i][j]);
110                 }
111             }
112             continue;
113         }
114         for(int j=1;j<=3;j++){
115             for(int k=j+1;k<=3;k++){
116                 d[i][j][0]=max(d[i][j][0],d[i-1][k][1]+a[i][j]);
117             }
118             for(int k=1;k<j;k++){
119                 d[i][j][1]=max(d[i][j][1],d[i-1][k][0]+a[i][j]);
120             }
121         }
122     }
123     ans=max(ans,d[n][1][0]);
124     ans=max(ans,d[n][2][0]);
125 
126     cout<<ans<<endl;
127 }
128 /*
129 6
130 3 10 4
131 5 5 1
132 6 10 7
133 4 5 3
134 9 9 8
135 6 9 2
136 
137 */

 

       

标签:cout,法力,int,个卡牌,1530,赛克,dp,define
From: https://www.cnblogs.com/ccsu-kid/p/18213988

相关文章

  • vb.net 利用APi 、句柄,通过GetWindowThreadProcessId 获得窗口所在进程ID和线程ID 结
    '''<summary>'''声明'''</summary>'''<paramname="hwnd"></param>'''<paramname="lpdwProcessId"></param>......
  • 蓝桥杯备赛——DP【python】
    一、小明的背包1试题链接:https://www.lanqiao.cn/problems/1174/learning/问题描述输入实例52016253851533输出示例37问题分析这里我们要创建一个DP表,DP(i,j)表示处理到第i个物品时消耗j体积。这样我们在输入数据时可以直接进行操作。对于每一个dp[i][j]我......
  • hi.选课(树形DP)
    [CTSC1997]选课(树形DP)题目描述在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习。现在有N......
  • 赛克oj The diameter of a rectangle(笛卡尔树)
    赛氪OJ-专注于算法竞赛的在线评测系统(saikr.com)这题是hduoj1506的加强版,区别在于宽度不是固定为1了,思路差不多,也是使用笛卡尔树。参考hduoj1506(笛卡尔树)-Venux-博客园(cnblogs.com)1#defineIOstd::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)2#definebu......
  • Java ThreadPoolExecutor
    ThreadPoolExecutor?ThreadPoolExecutor是什么,先拆开来看,ThreadPoolAndExecutor?那ThreadPool是什么?Executor又是什么?Executor:任务执行者,只定义了一个execute方法,接收一个Runable参数。publicinterfaceExecutor{voidexecute(Runnablecommand);}ThreadPool:可以缓存......
  • 区间DP
    区间DP区间DP的一般表达式:枚举区间长度枚举区间起点计算区间终点枚举区间断点P1220关路灯状态dp[i][j][0/1]表示区间[i,j]的路灯全关掉且站在i或j处的最小功耗答案min(dp[1][n][0],dp[1][n][1])状态转移for(intlen=2;len<=n;len++){ for(inti=1;i+len-1<=n;i++){......
  • 状压dp 例题
    终于在洛谷上发布题解了QWQP10447最短Hamilton路径题解分析题目:一张nnn个点的带权无向图,求起点0......
  • dp商品缓存
    缓存更新策略缓存更新是redis为了节约内存而设计出来的一个东西,主要是因为内存数据宝贵,当我们向redis插入太多数据,此时就可能会导致缓存中的数据过多,所以redis会对部分数据进行更新,或者把他叫为淘汰更合适。内存淘汰:redis自动进行,当redis内存达到咱们设定的max-memery的时......
  • hmdp-短信验证
    基于Session实现登录流程发送验证码:用户在提交手机号后,会校验手机号是否合法,如果不合法,则要求用户重新输入手机号如果手机号合法,后台此时生成对应的验证码,同时将验证码进行保存,然后再通过短信的方式将验证码发送给用户短信验证码登录、注册:用户将验证码和手机号进行输入,后......
  • 【教程】WordPress资源下载主题 Modown 书面使用教程
    这篇文章介绍了WordPress资源下载主题Modown的书面使用教程。文章包括安装主题、设置主题选项、自定义分类法、菜单、登录页面、小工具等。使用Modown主题可以通过设置首页模板一和使用mocat短代码来显示分类模块。同时还介绍了如何设置标题模块和显示广告。安装将从模板兔......