基础dp 记录
51nod 1134 最长递增子序列
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rep(i,l,r) for (int i=l; i<=r; i++)
typedef long long ll;
using namespace std;
const int N = 5e4+;
int n, s[N];
int dp[N]; int main(){
freopen("in.txt","r",stdin);
//freopen("a.out","w",stdout); scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d", &s[i]);
memset(dp,0x3f,sizeof(dp));
for(int i=;i<=n;i++) {
int l = lower_bound(dp+,dp++N,s[i])-(dp);
dp[l] = s[i];
}
int ans = lower_bound(dp+,dp++N,0x3f3f3f3f)-dp -;
cout << ans<<endl;
return ;
}
51nod 1050 循环数组最大子段和
考虑 成环的一个最大字段和 要么是正常的字段和 要么是整个环的总和 - (负的最大的 最小子段和)
#include<bits/stdc++.h>
using namespace std;
const int maxn = 5e4+;
int a[maxn],b[maxn],n;
typedef long long ll; ll solve (int *s)
{
ll ans =,res =;
for(int i=;i<n;i++)
{
ans+=s[i];
res = max(res,ans);
if(ans < )
ans =;
}
return res;
} int main ()
{ scanf("%d",&n);
ll res=;
for(int i=;i<n;i++)
{
scanf("%d",&a[i]);
b[i] = -a[i];
res += a[i];
}
ll ans1= solve(a),ans2=solve(b);
res= max(ans1,res+ans2);
printf("%lld\n",res);
return ;
}
51nod 1183 编辑距离
dp[i][j] 表示s1[i]和s2[j] 匹配好的,最小需要的花费
所以 dp[i][j] = min ( dp[i-1][j] + 1 //把s1[i] 删除 或者 添加s2[j]
dp[i][j-1] + 1 //把s2[j] 删除 或者 添加 s1[i]
dp[i-1][j-1] + (s1[i]==s2[j]) // 是否需要修改
#include <iostream>
#include <cstring>
#include <string.h>
using namespace std;
char s1[],s2[]; int dp[][]; int min(int a,int b,int c) {
if(b < a)
a = b;
return min(a,c);
} int main () {
scanf("%s %s", s1+, s2+);
int l1 = strlen(s1+);
int l2 = strlen(s2+);
memset(dp,0x3f,sizeof(dp));
for(int i=;i<=l1;i++)
dp[i][] = i;
for(int i=;i<=l2;i++)
dp[][i] = i; for(int i=; i<=l1; i++) {
for(int j=; j<=l2; j++) {
dp[i][j] = min(dp[i-][j]+,
dp[i][j-]+,
(dp[i-][j-]+(s1[i]!=s2[j]?:)));
//printf("%d ",dp[i][j]);
}
//puts("");
}
cout << dp[l1][l2] <<endl;
return ;
}
51nod 1051 最大子矩阵和
#include <bits/stdc++.h>
using namespace std; typedef long long ll;
const int N = ;
int n,m;
ll s[N][N], sum[N][N]; int main ()
{
scanf("%d %d", &m, &n);
for(int i=;i<=n;i++) {
for(int j=;j<=m;j++) {
scanf("%lld", &s[i][j]);
}
}
//保存每行的信息
for(int i=;i<=n;i++) {
for(int j=;j<=m;j++) {
sum[i][j] = sum[i][j-] + s[i][j];
}
}
ll mx = ;
for(int len=;len<=m;len++) {
for(int i=;i+len-<=m;i++) { //[i,j]i列到j列
int j = i+len-;
ll ans = ;
ll res = ;
for(int k=;k<=n;k++) {
//mx = max();
ans += sum[k][j] - sum[k][i-];
if(res < ans) res = ans;
if(ans < ) ans=;
}
mx = max(res,mx);
}
}
cout << mx <<endl;
return ;
}
51nod 1086 背包问题 V2
#include <bits/stdc++.h>
using namespace std; const int MAXW = +;
const int N = ;
typedef long long ll;
ll dp[MAXW];
int v[N],val[N],cnt[N];//体积 价值 数量 int n,w;
int main () {
//freopen("in.txt","r",stdin);
scanf("%d %d", &n, &w);
for(int i=;i<=n;i++) {
scanf("%d %d %d", &v[i], &val[i], &cnt[i]);
}
for(int i=;i<=n;i++) {
if(cnt[i]*v[i]>= w) {
for(int j=v[i]; j<=w; j++) {
dp[j] = max(dp[j], dp[j-v[i]] + val[i]);
}
}else {
int k=, tot = cnt[i];
while(k<tot) {
for(int j=w; j>=k*v[i]; j--) {
dp[j] = max(dp[j], dp[j-k*v[i]]+k*val[i]);
}
tot-=k;
k<<=;
}
for(int j=w;j>=tot*v[i];j--) {
dp[j] = max(dp[j], dp[j-tot*v[i]]+val[i]*tot);
}
}
}
cout << dp[w] <<endl;
return ;
}
51nod 1101 换零钱
#include <bits/stdc++.h>
using namespace std; typedef long long ll;
const int mod = 1e9+;
const int N = ;
int coin[] ={,,,,,,,,,,,,};
ll dp[N]; int main () {
int n;
scanf("%d",&n);
dp[] =;
for(int i=; i<; i++) {
for(int j=coin[i]; j<=n; j++) {
dp[j] = (dp[j] + dp[j-coin[i]])%mod;
}
}
cout << dp[n] <<endl;
return ;
}
51nod 1270 数组的最大代价
dp[i][0] : 表示当前A[i] 为1的最大代价
dp[i][1] : 表示当前A[i] 为B[i]的最大代价
#include <bits/stdc++.h>
using namespace std; typedef long long ll;
const int N =+; ll b[N],dp[N][]; int main()
{
int n;
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%lld",&b[i]);
for(int i=;i<=n;i++) {
dp[i][] = max(abs(-)+dp[i-][], abs(-b[i-])+dp[i-][]);
dp[i][] = max(abs(b[i]-)+dp[i-][], abs(b[i]-b[i-])+dp[i-][]);
}
cout << max(dp[n][], dp[n][])<<endl;
}
基础dp 记录的更多相关文章
- 基础dp
队友的建议,让我去学一学kuangbin的基础dp,在这里小小的整理总结一下吧. 首先我感觉自己还远远不够称为一个dp选手,一是这些题目还远不够,二是定义状态的经验不足.不过这些题目让我在一定程度上加 ...
- 「kuangbin带你飞」专题十二 基础DP
layout: post title: 「kuangbin带你飞」专题十二 基础DP author: "luowentaoaa" catalog: true tags: mathj ...
- C#基础知识记录一
C#基础知识记录一 static void Main(string[] args) { #region 合并运算符的使用(合并运算符??) 更多运算符请参考:https://msdn.microsof ...
- DataBase MongoDB基础知识记录
MongoDB基础知识记录 一.概念: 讲mongdb就必须提一下nosql,因为mongdb是nosql的代表作: NoSQL(Not Only SQL ),意即“不仅仅是SQL” ,指的是非关系型 ...
- MarkDown基础语法记录
基础语法记录,其中有一些博客园暂不支持 <!--标题--> # 一级标题 # ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ###### 六级标题 一级标题 ...
- 基础DP(初级版)
本文主要内容为基础DP,内容来源为<算法导论>,总结不易,转载请注明出处. 后续会更新出kuanbin关于基础DP的题目...... 动态规划: 动态规划用于子问题重叠的情况,即不同的子问 ...
- PAT L3-001 凑零钱(01背包dp记录路径)
韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债.韩梅梅手边有104枚来自各个星球的硬币,需要请你帮她盘算一下,是 ...
- hdu 5586 Sum 基础dp
Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Desc ...
- MongoDB基础知识记录
MongoDB基础知识记录 一.概念: 讲mongdb就必须提一下nosql,因为mongdb是nosql的代表作: NoSQL(Not Only SQL ),意即“不仅仅是SQL” ,指的是非关系型 ...
随机推荐
- ie8兼容半透明效果css
1.opacity:0.5;(半透明效果在ie9及以上版本适用,ie8及以下不兼容) 解决办法:在css中加入filter: progid:DXImageTransform.Microsoft.Alp ...
- Mirror--如何在主库上增加文件
由于各种原因,如磁盘不空不足,需要对主库增加数据库文件到其他磁盘上,而镜像服务器上没有对应盘符,很多人会选择删除镜像,重新完备还原来搭建镜像,这种方式耗时耗力. 在做此类操作时,需要对主服务器和镜像服 ...
- Andrew Ng-ML-第十五章-降维
1.数据压缩 数据压缩不仅能够减小存储空间,并且能够加速学习算法.那么什么是数据压缩呢?下面给出了一个简单的例子: 图1.数据压缩的概念 举了两个例子,一个是横轴x1是厘米,纵轴特征x2是英尺,这明显 ...
- libsvm使用
先挖个坑,有空重写svm_scale, svm_train, svm_predict几个代码,给的实在写的不敢恭维 package org.ml.svm; import java.io.File; i ...
- 手把手教你,C#.Net如何用Log4net把错误日志写入到SQLite数据库中
在项目中,我们往往会有把错误日志记录下来的习惯,这样有利于当网站发布后,能第一时间找到错误的所在地,以及错误的原因,以便于我们第一时间纠错.往往我们会把错误日志直接写到txt文本中,虽然操作简单,但是 ...
- 按照用户名和角色查询用户liferay
需求:当登录的用户输入用户的名字和角色的时候,模糊查询,然后就是Ajax的异步请求刷新界面 首先在一个工具类中写上一条你要写的sql语句代码如下: package com.ebizwindow.crm ...
- JaveScript-简介
1.JaveScript:脚本语言.(弱类型语言)可以写在head,也可以写在head里,同样可以写在html外面<script src=""></script& ...
- MFC六大核心机制之四:永久保存(串行化)
永久保存(串行化)是MFC的重要内容,可以用一句简明直白的话来形容其重要性:弄懂它以后,你就越来越像个程序员了! 如果我们的程序不需要永久保存,那几乎可以肯定是一个小玩儿.那怕我们的记事本.画图等小程 ...
- 搭建Linux-java web运行环境之二:安装mysql
环境 OS:Red Hat Enterprise Linux Server release 7.3 (Maipo) JDK:jdk-7u80-linux-x64.tar.gz Tomcat:apach ...
- Python: 合并拼接字符串join()| format() | +
将几个小字符串合并成为一个大的字符串 1如果合并的是一个序列,最快的方式是使用join()方法 >>> parts = ['Is', 'Chicago', 'Not', 'Chica ...