E. Sending a Sequence Over the Network

应该属于一个经典dp,可惜我没做出来。。。
思路:对于一个数字来说,它可以向左扩展,也可以向有扩展。
设计状态:f[i]表示第i位数字能否成功被包括
先讨论f[i]是否和法,由状态f[i-a[i]-1]转移得到;只有f[i]被表示时,才可将a[i+1]向右扩展。

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define For(i,a,b) for(i=(a);i<=(b);++i)
#define ios (ios::sync_with_stdio(false),cin.tie(0),cout.tie(0))
using namespace std;
const int N=2e5+5;
const int inf=1e18;
const int mod=998244353;
int n,a[N],f[N];void solve()
{cin >> n;for(int i=1;i<=n;i++) cin>>a[i],f[i]=0;f[0]=1;for(int i=0;i<=n;i++){if(i-a[i]-1>=0&&f[i-a[i]-1]) f[i]=1;if(!f[i]) continue;if(i+a[i+1]+1<=n&&f[i]) f[i+a[i+1]+1]=1;}if(f[n]) cout<<"YES"<<endl;elsecout<<"NO"<<endl;
}
signed main()
{//ios;int T;cin>>T;while(T--)solve();return 0;
}

C. Chef Monocarp

思路:KM算法求完美匹配的最大权值,左部点和右部点要求个数相同。
对于本题,左部点为烘培时间,右部点为拿出时间,因为拿出时间的不固定,构建虚点,连线权值要求为0,否则会对答案产生贡献。
由于是最小权值,转化为负值,边初始化为-inf,跑KM算法.

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define For(i,a,b) for(i=(a);i<=(b);++i)
#define ios (ios::sync_with_stdio(false),cin.tie(0),cout.tie(0))
using namespace std;
const int N=405;
const int inf=1e18;
const int mod=998244353;
int n,a[N];
int w[N][N],lx[N],ly[N];
bool visx[N],visy[N];
int match[N],delta,c[N],p[N];
int A[N],P[N],B[N],C[N];
void bfs(int x)         // O(n^3)的KM板子
{int a,y=0,y1=0;for(int i=1;i<=n;i++) p[i]=0,c[i]=inf;match[y]=x;do{a=match[y],delta=inf,visy[y]=1;for(int b=1;b<=n;b++){if(!visy[b]){if(c[b]>lx[a]+ly[b]-w[a][b])c[b]=lx[a]+ly[b]-w[a][b],p[b]=y;if(c[b]<delta) delta=c[b],y1=b;}}for(int b=0;b<=n;b++)if(visy[b]) lx[match[b]]-=delta,ly[b]+=delta;else c[b]-=delta;y=y1;}while(match[y]);while(y)match[y]=match[p[y]],y=p[y];
}
int KM()
{for(int i=1;i<=n;i++) match[i]=lx[i]=ly[i]=0;for(int i=1;i<=n;i++){for(int i=0;i<=n;i++) visy[i]=0;bfs(i);}int res=0;for(int i=1;i<=n;i++) res+=w[match[i]][i];return res;
}void solve()
{cin>>n;for(int i=1;i<=2*n;i++) a[i]=0;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=2*n;i++)for(int j=1;j<=2*n;j++) w[i][j]=-inf;for(int i=1;i<=n*2;i++){for(int j=1;j<=n*2;j++){if(i<=n)w[i][j]=(-1)*abs(a[i]-j);else w[i][j]=0;}}n*=2;cout<<-KM()<<endl;
}
signed main()
{ios;int T;cin>>T;while(T--)solve();return 0;
}

dp算法:
dp[i][j]表示第i道菜在第j分钟被拿出所需要的最小花费。

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define For(i,a,b) for(i=(a);i<=(b);++i)
#define ios (ios::sync_with_stdio(false),cin.tie(0),cout.tie(0))
using namespace std;
const int N=405;
const int inf=1e18;
const int mod=998244353;
int n,a[N],dp[N][N];void solve()
{cin>>n;for(int i=1;i<=n;i++) cin>>a[i];sort(a+1,a+n+1);for(int i=1;i<=n;i++) for(int j=0;j<=n*2;j++) dp[i][j]=inf;for(int i=1;i<=n;i++)for(int j=1;j<=n*2;j++){dp[i][j]=min(dp[i][j-1],dp[i-1][j-1]+abs(j-a[i]));//cout<<dp[i][j]<<endl;}int ans=inf;for(int i=1;i<=2*n;i++) ans=min(dp[n][i],ans);cout<<ans<<endl;
}
signed main()
{//ios;int T;cin>>T;while(T--)solve();return 0;
}

C. Even Number Addicts

思路:分清必胜态、必败态、先后手影响、各自的最优策略。
1.A想让自己的总和为偶数,偶数不会影响奇偶性,但奇数可以。
2.讨论奇数的数目,及相应偶数数量可能会产生的影响。

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define For(i,a,b) for(i=(a);i<=(b);++i)
#define ios (ios::sync_with_stdio(false),cin.tie(0),cout.tie(0))
using namespace std;
const int N=405;
const int inf=1e18;
const int mod=998244353;
int n,odd,even;void solve()
{odd=even=0;cin>>n;for(int i=1;i<=n;i++){int x;cin>>x;if(x%2) odd++;else even++;}if(odd%4==0) cout<<"Alice"<<endl;else if(odd%4==1){if(even%2) cout<<"Alice"<<endl;else cout<<"Bob"<<endl;}else if(odd%4==2) cout<<"Bob"<<endl;else if(odd%4==3){cout<<"Alice"<<endl;}}
signed main()
{//ios;int T;cin>>T;while(T--)solve();return 0;
}

I. Invoker

思路:明显想到要充分利用前一个指令的三个字母,才用dp记录的方式。
相当于只能储存3个字母,可打表记录。
设计状态:dp[i][j]表示字母i对应命令的第j种排列方式。
初始化:第一个字母固定需要三个命令字符
状态转移:dp[i][j]=min(dp[i][j],dp[i-1][g]+dis(mp[a[s[i-1]]][g],mp[a[s[i]]][j]));

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define For(i,a,b) for(i=(a);i<=(b);++i)
#define ios (ios::sync_with_stdio(false),cin.tie(0),cout.tie(0))
using namespace std;
const int N=405;
const int inf=1e18;
const int mod=998244353;
int n,dp[100005][6]; //第i个字母对应第j种排序方式的最小字符数
string s;
string mp[10][6]={{"QQQ","QQQ","QQQ","QQQ","QQQ","QQQ"},{"QQW","QWQ","QQW","QWQ","WQQ","WQQ"},{"QQE","QEQ","QQE","QEQ","EQQ","EQQ"},{"WWW","WWW","WWW","WWW","WWW","WWW"},{"QWW","QWW","WQW","WWQ","WQW","WWQ"},{"WWE","WEW","WWE","WEW","EWW","EWW"},{"EEE","EEE","EEE","EEE","EEE","EEE"},{"QEE","QEE","EQE","EEQ","EQE","EEQ"},{"WEE","WEE","EWE","EEW","EWE","EEW"},{"QWE","QEW","WQE","WEQ","EQW","EWQ"}};
map<char,int>a;
int dis(string s1,string s2)
{if(s1==s2) return 0;if(s1[1]==s2[0]&&s1[2]==s2[1]) return 1;else if(s1[2]==s2[0]) return 2;else return 3;
}
void solve()
{a['Y']=0,a['V']=1,a['G']=2,a['C']=3,a['X']=4;a['Z']=5,a['T']=6,a['F']=7,a['D']=8,a['B']=9;cin>>s;n=s.length();s=" "+s;for(int i=0;i<=n;i++) for(int j=0;j<6;j++) dp[i][j]=inf;for(int i=0;i<6;i++) dp[1][i]=3;for(int i=2;i<=n;i++){for(int j=0;j<6;j++){for(int g=0;g<6;g++){dp[i][j]=min(dp[i][j],dp[i-1][g]+dis(mp[a[s[i-1]]][g],mp[a[s[i]]][j]));}}}int ans=inf;for(int i=0;i<6;i++) ans=min(ans,dp[n][i]);cout<<ans+n<<endl;
}
signed main()
{//ios;//int T;cin>>T;//while(T--)solve();return 0;
}

打表+dp思维+博弈相关推荐

  1. CSP-S 2019————Emiya 家今天的饭————DP+思维

    题解:本题主要考查DP+思维. 简要题意:一个矩阵,要求每行只选一个节点,每列选的节点不能超过所有选的节点的一半,不能不选,给出每个节点的选择方案数,求总方案数. 1.DP+思维: (1).维护每列已 ...

  2. Ivan the Fool and the Probability Theory-Codeforces Round #594 (Div. 2)-C题(dp+思维)

    Ivan the Fool and the Probability Theory-Codeforces Round #594 (Div. 2)-C题(dp+思维) time limit per tes ...

  3. 创业与投资的思维博弈均衡,是创投长期成功之道

    2015年被普遍视为中国企业服务创业元年,自2015年至今三年来出现了不少优秀的企业服务创业案例.在2018年初的时候,专注于中国企业服务创投服务的咨询机构.定位于中国TMT产业升级与融合加速器钛资本 ...

  4. CodeForces - 594A Warrior and Archer(思维+博弈)

    题目链接:点击查看 题目大意:给出n个坐标轴上的点,两个人轮流操作,每次取走其中的一个点,直到最后剩余两个点为止,Vova先手,Vova希望两个点的距离尽可能小,Lesha希望两个点的距离尽可能大,问 ...

  5. Chess DP 思维题

    車是中国象棋中的一种棋子,它能攻击同一行或同一列中没有其他棋子阻隔的棋子.一天,小度在棋盘上摆起了许多車--他想知道,在一共N×M个点的矩形棋盘中摆最多个数的車使其互不攻击的方案数.他经过思考,得出了 ...

  6. HDU 4489 找出n!个全排列数中的“波浪数” dp 思维,全排列

    这题关键还是在于找出dp的转移方程,这题是从第n个数在前n-1个数的位置中入手,然后把"波浪数"分成两派.理解起来不困难,但是要自己想到的话,其中的思维一片也不能断掉,尤其是要找到 ...

  7. 数据结构——线性表知识思维导图

    此博客主要是线性表部分的知识思维导图 便于对线性表这一章节的知识在脑中形成一个知识体系 具体重要代码实现可以点击

  8. HDU多校10 - 6880 Permutation Counting(dp+思维)

    题目链接:点击查看 题目大意:给出一个长度为 n - 1 的 01 序列 b 用来表示排列 a 的相对大小关系,b[ i ] = 0 说明 a[ i ] < a[ i + 1 ] ,b[ i ] ...

  9. Lighting System Design UVA 11400 (dp+思维)

    题目大意:有一个照明系统需要用到n种灯,每种灯的电压为V,电源费用K,每个灯泡费用为C,需要该灯的数量为L.注意到,电压相同的灯泡只需要共享一个对应的电源即可,还有电压低的灯泡可以被电压高的灯泡替代. ...

最新文章

  1. C++中指向类的指针
  2. Python 性能剖分工具
  3. Leetcode 120. 三角形最小路径和 (每日一题 20210927)
  4. python累积和_python – 如何维持累积总和?
  5. Java | Python 流程控制对比
  6. 面向对象分析方法(Object-Oriented Analysis,OOA)
  7. VMware下虚拟系统上网与互ping
  8. c++ opengl 绘制地面_铝合金门窗设计之绘制节点图
  9. 2022年C语言教程入门和最新C语言自学教程C语言进阶教程大全
  10. fabric.js自定义字体的引入
  11. 洛谷入门题 深基2 例5~例8
  12. 中兴手机怎么与计算机连接网络连接不上,ZTE中兴为什么wifi连接上却不能上网...
  13. 数字集成电路物理设计_数字世界的物理词汇
  14. 跟零计算机基础的房东女儿讲了一下午的中间人劫持京东事件后,她感激涕零,决定给我免除房租......
  15. 定位漏水_即使在移动中也要防止销售漏水
  16. Java程序性能优化——设计优化
  17. 全触屏智能之战 三星i908E对比iPhone 3G
  18. 品Spring:bean定义上梁山
  19. jQuery Danmmu Player 弹幕视频
  20. 两个圆柱相交的体积 UVALive 5096 Volume

热门文章

  1. java 卷轴式_天堂1 java 编写活动卷轴方法
  2. Creator3D:shader13_水面涟漪
  3. Apk脱壳圣战之---如何脱掉 梆梆加固 的保护壳
  4. error C2338: /RTCc rejects conformant code错误解决
  5. mac下/usr/local/bin No such file or directory问题解决
  6. (二)巴菲特与索罗斯的投资习惯:七种致命的投资信念
  7. vue移动端使用手势库---alloytinger
  8. c++游戏服务器框架
  9. CSS实现按钮点击后根据背景色加深效果
  10. 《满城黄金甲》另类观后感