11.30考试总结
分数
| T1 | T2 | T3 | T4 | T5 | T6 | T7 |
|---|---|---|---|---|---|---|
| 100 | 100 | 100 | 100 | 100 | 0 | 50 |
T1 杨辉三角
每个\(dp\)的状态是\(dp_{i-1,j-1}\)与\(dp_{i-1,j}\)的和
点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=1e3+5;
int n,dp[maxn][maxn];
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
dp[i][1]=dp[i][i]=1;
}
for(int i=1;i<=n;i++){
for(int j=2;j<i;j++){
dp[i][j]=dp[i-1][j-1]+dp[i-1][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
cout<<dp[i][j]<<' ';
}
cout<<endl;
}
return 0;
}
T2 [USACO11JAN] Profits S
最大字段和模板
点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=1e6+5;
int n,a[maxn],dp[maxn];
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
memset(dp,0xe0,sizeof(dp));
dp[0]=0;
int maxi=-1e18;
for(int i=1;i<=n;i++){
dp[i]=max(dp[i-1]+a[i],a[i]);
maxi=max(maxi,dp[i]);
}
cout<<maxi;
return 0;
}
T3 [USACO1.5] [IOI1994]数字三角形 Number Triangles
如T1,每个\(dp\)的状态是\(dp_{i-1,j-1}\)与\(dp_{i-1,j}\)的最大值在加上当前节点的分数
点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=1e3+5;
int n,a[maxn][maxn],dp[maxn][maxn];
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
cin>>a[i][j];
}
}
memset(dp,-1,sizeof(dp));
dp[1][1]=a[1][1];
for(int i=2;i<=n;i++){
for(int j=1;j<=i;j++){
if(j==1){
dp[i][j]=dp[i-1][j]+a[i][j];
continue;
}
if(j==i){
dp[i][j]=dp[i-1][j-1]+a[i][j];
continue;
}
dp[i][j]=max(dp[i-1][j-1],dp[i-1][j])+a[i][j];
}
}
int maxi=-1e18;
for(int i=1;i<=n;i++){
maxi=max(maxi,dp[n][i]);
}
cout<<maxi;
return 0;
}
T4 [COCI2010-2011#7] ŠEĆER
考虑多重背包,多重背包板子
点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=5e3+5;
int n;
int dp[maxn];
int w[maxn];
signed main(){
cin>>n;
w[1]=3;
w[2]=5;
memset(dp,0x3f,sizeof(dp));
dp[3]=dp[5]=1;
for(int i=1;i<=2;i++){
for(int j=w[i];j<=n;j++){
dp[j]=min(dp[j],dp[j-w[i]]+1);
}
}
if(dp[n]==dp[0]){
cout<<"-1"<<endl;
return 0;
}
cout<<dp[n];
return 0;
}
T5 友好城市
感觉是考试中唯二的有思考难度的题
首先,将南端城市按大小排序,只处理北端情况
北端与南段的航道要不相交,则南端友好城市必须持续不下降,发现就是求最长不下降子序列
加贪心优化,在DP刷题总结-2中已经叙述过
点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=1e6+5;
int n;
struct Node{
int north,sorth;
}a[maxn];
int c[maxn],dp[maxn];
bool cmp(Node x,Node y){
return x.sorth<y.sorth;
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].sorth>>a[i].north;
}
sort(a+1,a+n+1,cmp);
int maxi=-1e9;
memset(c,0x3f,sizeof(c));
for(int i=1;i<=n;i++){
int pos=lower_bound(c+1,c+i,a[i].north)-c;
// cout<<pos<<' ';
dp[i]=pos;
maxi=max(maxi,dp[i]);
c[pos]=a[i].north;
// cout<<dp[i]<<endl;
}
cout<<maxi<<endl;
return 0;
}
T6 闯关游戏
定义\(dp_i\)为到达关卡\(i\)时能获得的最大价值
那么只需枚举1-m,枚举上一个通过的通道即可
需要离开后才算分数,所以将上一个关卡的分数算进此关卡中
然后可能到达\(n\)以外的关卡,所以求答案时要枚举到\(n+n\)
点击查看代码
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=4e4+5;
int n,m,dp[maxn],a[maxn],b[maxn];
signed main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
cin>>b[i];
}
memset(dp,0xefefef,sizeof(dp));
dp[1]=0;
for(int i=1;i<=n+n+n;i++){
for(int j=1;j<=m;j++){
if(i-a[j]>0){
dp[i]=max(dp[i],dp[i-a[j]]+b[i-a[j]]);
}
}
}
int maxi=-1e9;
for(int i=n+1;i<=n+n+n;i++){
maxi=max(maxi,dp[i]);
}
cout<<maxi;
return 0;
}
本人(KK_SpongeBob)蒟蒻,写不出好文章,但转载请注明原文链接:https://www.cnblogs.com/OIer-QAQ/p/18580264/11-30-test

浙公网安备 33010602011771号