dp1,明天补题解

洛谷1156 垃圾陷阱

#include<bits/stdc++.h>
#define inf 1000000007
using namespace std;
int d,g,ans;
bool f;
struct sd{
int t,f,h;
bool operator < (const sd q) const{
return t<q.t;
};
}s[1009];
int dp[2][109],q[109];
int main(){
scanf("%d%d",&d,&g);
for(int i=1;i<=g;i++){
scanf("%d%d%d",&s[i].t,&s[i].f,&s[i].h);
}sort(s+1,s+g+1);for(int j=0;j<=105;j++) dp[0][j]=-inf;dp[0][0]=10;

s[g+1].t=inf;
memset(q,-1,sizeof(q));
for(int i=1;i<=g;i++){
for(int j=0;j<=105;j++){
q[j+s[i].h]=max(dp[(i-1)&1][j],q[j+s[i].h]);
q[j]=max(q[j],dp[(i-1)&1][j]+s[i].f);
}f=0;

for(int j=d;j<=105;j++){
if(q[j]>=0){
printf("%d\n",s[i].t);return 0;
}
}

for(int j=0;j<=105;j++){
dp[i&1][j]=q[j];if(q[j]>=s[i+1].t) f=1;
else dp[i&1][j]=-inf;
}

if(!f){
for(int j=0;j<=105;j++) if(ans<q[j]) ans=q[j];
printf("%d\n",ans);return 0;
}
memset(q,-1,sizeof(q));
}

for(int i=1;i<=105;i++){
if(dp[g&1][i]>ans) ans=dp[g&1][i];
}printf("%d\n",ans);
return 0;
}

洛谷1019 单词接龙

没有复杂度证明,而且随便一组数据就能T飞

#include<bits/stdc++.h>
using namespace std;
int n,to[22][22],ans,vis[22];
char s[22][1000];
bool f=0;
void dfs(int b,int x){
    if(x>ans) ans=x;
    for(int i=1;i<=n;i++){
        if(to[b][i]&& (vis[i]<2)) {
            vis[i]++;
            dfs(i,x+strlen(s[i])-to[b][i]);
            vis[i]--;
        }
    }
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%s",s[i]);
    }
    scanf("%s",s[0]);
    for(int i=0;i<=n;i++){
        for(int j=0;j<=n;j++){
            for(int k=strlen(s[i])-1;k>=0;k--){f=0;
                for(int q=k;q<strlen(s[i]);q++){
                    if(s[i][q]!=s[j][q-k]) f=1;
                }
                if(!f){
                    to[i][j]=strlen(s[i])-k;
                    break;
                }
            }
        }
    }
    vis[0]=2;
    dfs(0,1);
    printf("%d\n",ans);
    return 0;
}

【bzoj1600】[Usaco2008 Oct]建造栅栏

#include<bits/stdc++.h>
using namespace std;
int n,dp[2005][5];
int main(){
    freopen("x.in","r",stdin);
    freopen("x1.out","w",stdout);
    scanf("%d",&n);
    dp[1][1]=1;int s=n/2;if(n%2) s++;
    for(int i=2;i<=n;i++)
    for(int j=1;j<=4;j++){
        dp[i][j]=dp[i-1][j]+dp[i-1][j-1];
        if(i>=(s+j-1)&&j>1) dp[i][j]-=dp[i-s][j-1];
        if(i>=(s+j-1)&&j==1) dp[i][j]--;
        if(dp[i][j]<0) dp[i][j]=0;
    }
    printf("%d\n",dp[n][4]);
    return 0;
}

【bzoj1617】River Crossing渡河问题

#include<bits/stdc++.h>
#define maxn 2505
#define inf 10000000000000000
#define ll long long
//记得看范围
using namespace std;
ll n,m[maxn],dp[maxn];
int main(){
    scanf("%lld%lld",&n,&m[0]);
    for(int i=1;i<=n;i++){
        scanf("%lld",&m[i]);
        m[i]+=m[i-1];dp[i]=inf;
    }
    dp[0]=0;
    for(int i=0;i<=n;i++){
        for(int j=1;j+i<n;j++){
            dp[i+j]=min(dp[i+j],dp[i]+m[j]+m[0]);
        }
        dp[n]=min(dp[n],dp[i]+m[n-i]);
    }
    printf("%lld\n",dp[n]);
}

bzoj3791作业

#include<bits/stdc++.h>
using namespace std;
int n,dp[2][155][2],k,ans;
int main(){
    scanf("%d%d",&n,&k);int a;scanf("%d",&a);
    dp[1][1][a]=1;
    for(int p=0,q=1,i=1;i<n;i++,swap(p,q)){
        scanf("%d",&a);
        for(int j=1;j<=2*k-1;j++)
        for(int x=0;x<2;x++)
        for(int y=0;y<2;y++){
            dp[p][j+(x!=y)][y]=max(dp[q][j][x]+(y==a),dp[p][j+(x!=y)][y]);
            //记得把相同的放前面,改自己代码之前先想一想
        }
        for(int j=1;j<=2*k-1;j++){
            ans=max(ans,dp[p][j][0]);ans=max(ans,dp[p][j][1]);
            dp[q][j][0]=dp[q][j][1]=0;
        }
    }
    printf("%d\n",ans);
    return 0;
}
时间: 2024-10-14 16:43:50

dp1,明天补题解的相关文章

明天补完

/* cogs 943. [東方S3] 铃仙?优昙华院?稻叶 概率dp 貌似做麻烦了 邻接矩阵和链式前向星都用上了... f[pos][i][j]表示 第i秒 在i点 上一个经过的点是j 方程: f[pos][i][j]=Σf[pos-1][j][k]*(__out[j]+1-(map[j][k]==1))+f[pos-1][i][j]*(__out[i]+1-(map[i][j]==1) 前面的求和考虑的是上一秒从其他的一个节点走过来 后面的考虑的是上一秒选择停留在原地 复杂度O(T * N^

(补题解)Codeforces Round #271 (Div. 2)

前言:最近被线段树+简单递推DP虐的体无完肤!真是弱! A:简单题,照着模拟就可以,题目还特意说不用处理边界 B:二分查找即可,用lower_lound()函数很好用 1 #include<string.h> 2 #include<math.h> 3 #include<algorithm> 4 #include<stdio.h> 5 #include<math.h> 6 #include<string> 7 #include<i

ZJOI2010 诸神眷顾的幻想乡

题目链接:戳我 非常不好意思,因为想要排版,所以今天先只把代码贴出来,明天补题解. #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #define MAXN 2000010 using namespace std; int tot=1,n,m,tt; int du[MAXN],a[MAXN],head[MAXN];

HEOI2016/TJOI2016 字符串问题

题目链接:戳我 非常不好意思,因为想要排版,所以今天先只把代码贴出来,明天补题解. 40pts暴力:直接暴力匹配 #include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<cstdio> #define MAXN 100010 using namespace std; int n,m; char s[MAXN]; inline int sol

POJ2074:Line of Sight——题解

http://poj.org/problem?id=2074 题目大意:(下面的线段都与x轴平行)给两条线段,一个点在其中一条线段看另一条线段,但是中间有很多线段阻挡视线.求在线段上最大连续区间使得在上面的点都能看见另一条线段. —————————————— 题解先割了,明天补上. #include<cstdio> #include<queue> #include<cctype> #include<cstring> #include<vector>

COJ 0970 WZJ的数据结构(负三十)树分治

WZJ的数据结构(负三十) 难度级别:D: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给你一棵N个点的无根树,点和边上均有权值.请你设计一个数据结构,回答M次操作. 1 x v:对于树上的每一个节点y,如果将x.y在树上的距离记为d,那么将y节点的权值加上d*v. 2 x:询问节点x的权值. 输入 第一行为一个正整数N.第二行到第N行每行三个正整数ui,vi,wi.表示一条树边从ui到vi,距离为wi.第N+1行为一个正整数M.最后

BZOJ3206 [Apio2013]道路费用

题解啊...明天补吧... 好累啊... 1 /************************************************************** 2 Problem: 3206 3 User: rausen 4 Language: C++ 5 Result: Accepted 6 Time:8040 ms 7 Memory:8232 kb 8 ***************************************************************

[您有新的未分配科技点]数位DP:从板子到基础

只会统计数位个数或者某种"符合简单规律"的数并不够--我们需要更多的套路和应用 数位dp中常用的思想是"分类讨论"思想.下面我们就看一道典型的分类讨论例题 1026: [SCOI2009]windy数 Time Limit: 1 Sec  Memory Limit: 162 MB Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个wind

cf#366....

惨惨惨.... 我需要av.. b题意看错想了个加强版博弈结果发现完全没必要= =....cwa12到结束....中途想看d....只会n^4暴力啊.. 题解明天补上