数据结构没什么好写的。。分块和整体二分还有点分学得很懂。。果然我还是比较适合这些东西

poj2279 奇怪题,我的想法就是五维记录最边上的一斜排,会M,结果的的确确是锻炼思维的,正解并不是DP2333

LCIS 这个。。。其实还挺常规的吧(脑子一抽),f[i][j]表示第一个匹配到i第二个匹配到j且选了j。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std; int a[],b[],f[][];
int main()
{
int n;
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
for(int i=;i<=n;i++)scanf("%d",&b[i]); for(int i=;i<=n;i++)
{
int mx=;
for(int j=;j<=n;j++)
{
if(a[i]!=b[j])f[i][j]=f[i-][j];
else f[i][j]=mx+;
if(b[j]<a[i])mx=max(mx,f[i-][j]);
}
} int ans=;
for(int j=;j<=n;j++)ans=max(ans,f[n][j]);
printf("%d\n",ans);
return ;
}

LCIS

poj3666 首先要证明的是一定存在一种构造b的方案令所有b值都在a中出现过(我就不证了),f[i][j]表示枚举到i,且当前等于a数组中排名为j的那个数的最小值,和上题一样可以省掉一个for(也是常规操作吧)

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL; int n,m; LL a[],ls[];
void LSH()
{
m=;
for(int i=;i<=n;i++)ls[++m]=a[i];
sort(ls+,ls+m+);
m=unique(ls+,ls+m+)-ls-;
for(int i=;i<=n;i++)
a[i]=lower_bound(ls+,ls+m+,a[i])-ls;
} LL ans;
LL f[][];
LL myabs(LL x){return x>?x:-x;}
void DP1()
{
memset(f,,sizeof(f));
for(int j=;j<=n;j++)f[][j]=myabs(ls[a[]]-ls[j]);
for(int i=;i<=n;i++)
{
LL mn=(1LL<<);
for(int j=;j<=m;j++)
{
mn=min(mn,f[i-][j]);
f[i][j]=mn+myabs(ls[a[i]]-ls[j]);
}
}
for(int j=;j<=n;j++)ans=min(ans,f[n][j]);
}
void DP2()
{
memset(f,,sizeof(f));
for(int j=;j<=n;j++)f[][j]=myabs(ls[a[]]-ls[j]);
for(int i=;i<=n;i++)
{
LL mn=(1LL<<);
for(int j=m;j>=;j--)
{
mn=min(mn,f[i-][j]);
f[i][j]=mn+myabs(ls[a[i]]-ls[j]);
}
}
for(int j=;j<=n;j++)ans=min(ans,f[n][j]);
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%lld",&a[i]);
LSH(); ans=(1LL<<);
DP1();DP2();
printf("%lld\n",ans);
return ;
}

poj3666

Mobile Service 这个省维的思想还挺好的,因为要修第i-1个位置,那么当要修第i个位置的时候肯定有个人在p[i-1]省去一维

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std; int mp[][],p[];
int f[][][]; int main()
{
int n,Q;
scanf("%d%d",&n,&Q);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
scanf("%d",&mp[i][j]);
p[]=;
for(int i=;i<=Q;i++)scanf("%d",&p[i]); memset(f,,sizeof(f));f[][][]=f[][][]=;
for(int i=;i<Q;i++)
{
for(int j=;j<=n;j++)
if(j!=p[i])
for(int k=;k<=n;k++)
if(k!=p[i]&&k!=j)
if(f[i][j][k]<=)
{
f[i+][j][k]=min(f[i+][j][k],f[i][j][k]+mp[p[i]][p[i+]]);
f[i+][p[i]][k]=f[i+][k][p[i]]=min(f[i+][p[i]][k],f[i][j][k]+mp[j][p[i+]]);
f[i+][p[i]][j]=f[i+][j][p[i]]=min(f[i+][p[i]][j],f[i][j][k]+mp[k][p[i+]]);
}
}
int ans=;
for(int j=;j<=n;j++)
for(int k=;k<=n;k++)
ans=min(ans,f[Q][j][k]);
printf("%d\n",ans);
return ;
}

Mobile Service

传纸条 表示我一眼插头DP 然而就是大力DP就好,只用三维,因为只能下或右走那么当前两条线的位置肯定是在一条右往左的斜线上,也就是x1+y1=x2+y2

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std; int a[][];
int f[][][];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%d",&a[i][j]); memset(f,,sizeof(f));f[][][]=a[][]+a[][];
for(int i=;i<n+m-;i++)
{
for(int x1=;x1<=m;x1++)
{
int y1=i+-x1;
if(y1<=n)
{
for(int x2=;x2<=x1-;x2++)
{
int y2=i+-x2;
if(y2<=n)
{
if(y1+<=n&&y2+<=n)f[i+][x1][x2]=max(f[i+][x1][x2],f[i][x1][x2]+a[y1+][x1]+a[y2+][x2]);
if(x1+<=m&&x2+<=m)f[i+][x1+][x2+]=max(f[i+][x1+][x2+],f[i][x1][x2]+a[y1][x1+]+a[y2][x2+]);
if(y1+<=n&&x2+<=m&&(x2+<x1||i==n+m-))f[i+][x1][x2+]=max(f[i+][x1][x2+],f[i][x1][x2]+a[y1+][x1]+a[y2][x2+]);
if(x1+<=m&&y2+<=n)f[i+][x1+][x2]=max(f[i+][x1+][x2],f[i][x1][x2]+a[y1][x1+]+a[y2+][x2]);
}
}
}
}
}
printf("%d\n",f[n+m-][m][m]);
return ;
}

传纸条

I-country 超麻烦,需要考虑行数,左右边界,当前权,当前左右区间分别是上升还是下降

contest hunter5105 Cookies

0x51 线性DP的更多相关文章

  1. 算法竞赛进阶指南0x51 线性DP

    AcWing271. 杨老师的照相排列 思路 这是一个计数的题目,如果乱考虑,肯定会毫无头绪,所以我们从1号到最后一个依次进行安排. 经过反复实验,发现两个规律 每一行的同学必须是从左向右依次连续放置 ...

  2. LightOJ1044 Palindrome Partitioning(区间DP+线性DP)

    问题问的是最少可以把一个字符串分成几段,使每段都是回文串. 一开始想直接区间DP,dp[i][j]表示子串[i,j]的答案,不过字符串长度1000,100W个状态,一个状态从多个状态转移来的,转移的时 ...

  3. Codeforces 176B (线性DP+字符串)

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...

  4. hdu1712 线性dp

    //Accepted 400 KB 109 ms //dp线性 //dp[i][j]=max(dp[i-1][k]+a[i][j-k]) //在前i门课上花j天得到的最大分数,等于max(在前i-1门 ...

  5. 动态规划——线性dp

    我们在解决一些线性区间上的最优化问题的时候,往往也能够利用到动态规划的思想,这种问题可以叫做线性dp.在这篇文章中,我们将讨论有关线性dp的一些问题. 在有关线性dp问题中,有着几个比较经典而基础的模 ...

  6. POJ 2479-Maximum sum(线性dp)

    Maximum sum Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 33918   Accepted: 10504 Des ...

  7. poj 1050 To the Max(线性dp)

    题目链接:http://poj.org/problem?id=1050 思路分析: 该题目为经典的最大子矩阵和问题,属于线性dp问题:最大子矩阵为最大连续子段和的推广情况,最大连续子段和为一维问题,而 ...

  8. nyoj44 子串和 线性DP

    线性DP经典题. dp[i]表示以i为结尾最大连续和,状态转移方程dp[i] = max (a[i] , dp[i - 1] + a[i]) AC代码: #include<cstdio> ...

  9. 『最大M子段和 线性DP』

    最大M子段和(51nod 1052) Description N个整数组成的序列a[1],a[2],a[3],-,a[n],将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的.如果M &g ...

随机推荐

  1. .net中的WebForm引人MVC的控制器

    当下.net中比较火的模式MVC模式,说实话对于菜鸟的我还没有遇到一个比较健全的MVC模式的项目也是比较遗憾.偶然间在网上看到WebForm实现MVC中的模式(主要是控制器...)就学习了一波,下面是 ...

  2. retrofit post请求多文件,partMap用法

    1. APIService 定义注解 @Multipart @POST("cyxx/Feedback/add.do") Observable<ResponseBody> ...

  3. avaScript中变量的声明和赋值

    变量是指程序中一个已经命名的存储单元,它的主要作用就是为数据操作提供存放信息的容器.变量是相对常量而言的.常量是一个不会改变的固定值,而变量的值可能会随着程序的执行而改变.变量有两个基本特征,即变量名 ...

  4. 偶尔遇到的“The request was aborted:Could not create SSL/TLS secure channel.”怎么解决?

    项目中涉及到调用第三方的Https的WebService,我使用的是原始的HttpWebRequest. 代码中已经考虑到是Https,加上了SSL3协议,加上了委托调用.但偶尔还是会碰到 The r ...

  5. 复习java基础第一天

    一:static static: 静态的.   1. 若需要一个类的多个对象共享一个变量,则该变量需要使用 static 修饰.   2. 因为 static 修饰的变量为类的所有的实例所共享,所以 ...

  6. Oracle存储过程给变量赋值的方法

    截止到目前我发现有三种方法可以在存储过程中给变量进行赋值: 1.直接法     := 如:v_flag := 0; 2.select into 如:假设变量名为v_flag,select count( ...

  7. 读书笔记「Python编程:从入门到实践」_5.if语句

    5.1 一个简单示例 cars = ['audi', 'bmw', 'subaru', 'toyota'] for car in cars: if car == 'bmw': print(car.up ...

  8. slf4j日志只输出到控制台,没输出到日志文件

    最近使用SLF4J遇到了一个比较头疼的坑,日志输出到控制台没有问题,但是始终没有输出到日志文件.无论怎麽修改日志配置,始终是老样子. 有一种绝望,是各种百度.google却还是解决不了问题..直到我在 ...

  9. 【sqli-labs】 less1 GET - Error based - Single quotes - String(GET型基于错误的单引号字符型注入)

    GET方式提交id参数 添加单引号,出现报错,爆出数据库名称和部分SQL语句 http://localhost/sqli/Less-1/?id=1' 使用order by猜测字段数,用#注释掉后面li ...

  10. Windows Server 2008 R2 搭建DNS服务器(转)

    Windows Server 2008 R2 搭建DNS服务器将本机IP设为首选DNS服务器的地址在dos 下分别输入 nslookup www.mydns.com 和 nslookup 192.16 ...