dp

HDU - 1257 最少拦截系统

最长递增子序列

 #include<iostream>
using namespace std;
const int maxn=1e7;
int a[maxn],dp[maxn],n; int main()
{
while(cin>>n) {
for (int i = ; i <= n; i++)cin >> a[i];
for (int i = ; i <= n; i++)dp[i] = ;
for (int i = ; i <= n; i++)
for (int j = ; j < i; j++) {
if (a[i] > a[j])
dp[i] = max(dp[i], dp[j] + );
}
int ans = ;
for (int i = ; i <= n; i++)ans = max(ans, dp[i]);
cout << ans << endl;
}
return ;
}

HDU - 1029 Ignatius and the Princess IV

HDU - 1069 Monkey and Banana

POJ - 1458 Common Subsequence

最长公共子序列

dp[i][j] = 0                                        i==0 || j==0

= max(dp[i][j], dp[i-1][j-1]+1)    a[i-1]==b[i-1]

= max(dp[i-1][j], dp[i][j-1])       a[i-1]!=b[i-1]

 #include<string>
#include <iostream>
using namespace std;
const int maxn=1e4+;
int dp[maxn][maxn];
int main()
{
string s1,s2;
while(cin>>s1>>s2)
{
int len1=s1.size();
int len2=s2.size();
for(int i=;i<=len1;i++)
for(int j=;j<=len2;j++)
dp[i][j]=;
for(int i=;i<=len1;i++)
for(int j=;j<=len2;j++)
{
if((i==)||(j==))continue;
else if(s1[i-]==s2[j-])
dp[i][j]=max(dp[i][j],dp[i-][j-]+);
else
{
dp[i][j]=max(dp[i][j],dp[i][j-]);
dp[i][j]=max(dp[i][j],dp[i-][j]);
}
}
cout<<dp[len1][len2]<<endl;
}
return ;
}

POJ - 2533 Longest Ordered Subsequence

 while(cin>>n)
{
for(int i=;i<=n;i++)cin>>a[i];
for(int i=;i<=n;i++)dp[i]=;
for(int i=;i<=n;i++)
{
for(int j=;j<i;j++)
{
if(a[i]>a[j])
dp[i]=max(dp[i],dp[j]+);
}
ans=max(ans,dp[i]);
}
cout<<ans<<endl;
}

HDU - 1003 Max Sum

 #include<iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn=1e5+;
long long dp[maxn],a[maxn],ans=-0xfffffffffffff;
int n,t=,T=,l,r; int main()
{
cin>>n;
while(n--)
{
cin>>t;
T++;
for(int i=;i<=t;i++)cin>>a[i];
for(int i=-;i<=t;i++)dp[i]=a[i];
for(int i=;i<=t;i++)
dp[i]=max(dp[i-]+a[i],dp[i]);
for(int i=;i<=t;i++)
{
if(dp[i]>ans){
ans=max(ans,dp[i]);
r=i;
}
}
long long sum=;
for(int i=r;i>=;i--) {
sum += a[i];
if (sum == ans) {
l = i;
}
}
if(T!=)cout<<endl;
cout<<"Case "<<T<<":"<<endl;
cout<<ans<<" "<<l<<" "<<r<<endl;
}
return ;
}

HDU - 3421 Max Sum II

HDU - 1024 Max Sum Plus Plus

HDU - 1244 Max Sum Plus Plus Plus

HDU - 1087 Super Jumping! Jumping! Jumping!

HDU - 1114 Piggy-Bank

HDU - 1176 免费馅饼

HDU - 1160 FatMouse's Speed

POJ - 1661 Help Jimmy

HDU - 1260 Tickets

POJ - 3186 Treats for the Cows

HDU - 1078 FatMouse and Cheese

HDU - 2859 Phalanx

POJ - 3616 Milking Time

POJ - 3666 Making the Grade

HDU - 1074 Doing Homework

UVA - 11367 Full Tank?

POJ - 1015 Jury Compromise

题意:选m人:控方和辩方会根据对候选人的喜欢程度,给候选人打分,分值从0到20。为了公平起见,法官选出陪审团的原则是:选出的m个人,必须满足辩方总分D和控方总分P的差的绝对值|D-P|最小。如果有多种选择方案的 |D-P| 值相同,那么选辩控双方总分之和D+P最大的方案。

输出:要求输出这m个人的辩方总值D和控方总值P,并升序输出他们的编号

思路:

辩方总分和控方总分之差称为“辩控差”,辩方总分和控方总分之和称为“辩控和”。

第i个候选人的辩方总分和控方总分之差记为V(i),之和记为S(i)。

状态:dp[j][k]表示,取j个候选人,使其辩控差为k的所有方案中,辩控和最大的方案的辩控和。

如果没法选j个人,使其辩控差为k,那么dp(j, k)的值就为-1。

求:dp[m][k] (-20×m ≤ k ≤ 20×m)

转移方程:dp[j][k]= max ( dp[j-1][k-V[i]]+S[i], dp[j][k] )

方案dp[j][k]是由某个可行的方案 dp[j-1][x] 演化而来,可行方案 dp[j-1][x] 能演化成方案 dp[j][k] 的必要条件是:存在某个候选人i,i 在方案 dp[j-1][x] 中没有被选上,且x+V(i) = k。在所有满足该必要条件的dp[j-1][x]中,选出 dp[j-1][x]+ S(i) 的值最大的。

程序中没有求绝对值而是将辩控差都加上修正值fix=400,以免下标为负数导致出错,此时初始条件修正为dp[0][fix] = 0,其他均为-1。DP后,从第m行的dp(m, fix)开始往两边搜索最小|D-P| 即可,第一个不为dp[m][k]!=-1的位置k就是最小|D-P|的所在。

 #include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
int f[][];
//f[j][k]表示:取j个候选人,使其辩控差为k的方案中
//辩控和最大的那个方案(该方案称为“方案f(j,k)”)的控辩和
int Path[][];
//Path数组用来记录选了哪些人
//方案f(j,k)中最后选的那个候选人的编号,记在Path[j][k]中
int P[];//控方打分
int D[]; //辩方打分 int Answer[];//存放最终方案的人选 int main()
{
int i,j,k;
int t1,t2;
int n,m;
int MinP_D;//辩控双方总分一样时的辩控差
int Case;//测试数据编号
Case=;
while(scanf("%d %d",&n,&m))
{
if(n==&&m==)break;
Case++;
for(i=;i<=n;i++)
scanf("%d %d",&P[i],&D[i]);
memset(f,-,sizeof(f));
memset(Path,,sizeof(Path));
MinP_D=m*;//题目中的辩控差为0,对应于程序中的辩控差为m*20
f[][MinP_D]=;
for(j=;j<m;j++)//每次循环选出第j个人,共要选出m人
{
for(k=;k<=MinP_D*;k++)//可能的辩控差为[0,nMinP_D*2]
if(f[j][k]>=)//方案f[j][k]可行
{
for(i=;i<=n;i++)
if(f[j][k]+P[i]+D[i]>f[j+][k+P[i]-D[i]])
{
t1=j;t2=k;
while(t1>&&Path[t1][t2]!=i)//验证i是否在前面出现过
{
t2-=P[Path[t1][t2]]-D[Path[t1][t2]];
t1--;
}
if(t1==)
{
f[j+][k+P[i]-D[i]]=f[j][k]+P[i]+D[i];
Path[j+][k+P[i]-D[i]]=i;
}
}
}
}
i=MinP_D;
j=;
while(f[m][i+j]<&&f[m][i-j]<) // 从中间向两边开始找辩控差最小和最大
j++;
if(f[m][i+j]>f[m][i-j])
k=i+j;
else
k=i-j;
printf("Jury #%d\n",Case);
printf("Best jury has value %d for prosecution and value %d for defence:\n",(k-MinP_D+f[m][k])/,(f[m][k]-k+MinP_D)/);
for(i=;i<=m;i++)
{
Answer[i]=Path[m-i+][k];
k-=P[Answer[i]]-D[Answer[i]];
}
sort(Answer+,Answer++m);
for(i=;i<=m;i++)
printf(" %d",Answer[i]);
printf("\n\n");
}
return ;
}

kuangbin带你飞dp专题-基础dp的更多相关文章

  1. 「kuangbin带你飞」专题十二 基础DP

    layout: post title: 「kuangbin带你飞」专题十二 基础DP author: "luowentaoaa" catalog: true tags: mathj ...

  2. 「kuangbin带你飞」专题二十 斜率DP

    layout: post title: 「kuangbin带你飞」专题二十 斜率DP author: "luowentaoaa" catalog: true tags: mathj ...

  3. 「kuangbin带你飞」专题二十二 区间DP

    layout: post title: 「kuangbin带你飞」专题二十二 区间DP author: "luowentaoaa" catalog: true tags: - ku ...

  4. 「kuangbin带你飞」专题十四 数论基础

    layout: post title: 「kuangbin带你飞」专题十四 数论基础 author: "luowentaoaa" catalog: true tags: mathj ...

  5. 「kuangbin带你飞」专题十七 AC自动机

    layout: post title: 「kuangbin带你飞」专题十七 AC自动机 author: "luowentaoaa" catalog: true tags: - ku ...

  6. 「kuangbin带你飞」专题十九 矩阵

    layout: post title: 「kuangbin带你飞」专题十九 矩阵 author: "luowentaoaa" catalog: true tags: mathjax ...

  7. 「kuangbin带你飞」专题十八 后缀数组

    layout: post title: 「kuangbin带你飞」专题十八 后缀数组 author: "luowentaoaa" catalog: true tags: - kua ...

  8. 「kuangbin带你飞」专题十五 数位DP

    传送门 A.CodeForces - 55D Beautiful numbers 题意 一个正整数是 漂亮数 ,当且仅当它能够被自身的各非零数字整除.我们不必与之争辩,只需计算给定范围中有多少个漂亮数 ...

  9. kuangbin带你飞 生成树专题 : 次小生成树; 最小树形图;生成树计数

    第一个部分 前4题 次小生成树 算法:首先如果生成了最小生成树,那么这些树上的所有的边都进行标记.标记为树边. 接下来进行枚举,枚举任意一条不在MST上的边,如果加入这条边,那么肯定会在这棵树上形成一 ...

随机推荐

  1. 笔记本装双系统!win10+Linux!所有的坑自己一个个爬过来,纪念一下。

    笔记本装双系统!win10+Linux!所有的坑自己一个个爬过来,纪念一下. 2018年09月16日 21:27:19 Corax_2ven 阅读数:14038   写在前面,装了大概5遍,装了删删了 ...

  2. luogu3346 诸神眷顾的幻想乡 (广义SAM)

    首先,让每一个叶节点做一次树根的话,每个路径一定至少有一次会变成直上直下的 于是对于每个叶节点作为根产生的20个trie树,把它们建到同一个广义SAM里 建法是对每个trie dfs去建,last就是 ...

  3. MySQL防止库存超卖方法总结

    订单超卖问题是涉及到库存项目的重中之重,这里我总结一下常用的方法 1.简单处理[update & select 合并](乐观锁) beginTranse(开启事务)$num = 1; try{ ...

  4. PHP之道 - php各方面的知识汇总

    看到一个PHP的知识各方面的汇总,写的很有借鉴意义,搬过来了 转自: https://laravel-china.github.io/php-the-right-way/ 欢迎阅读 其他语言版本 参与 ...

  5. 安装python caffe过程中遇到的一些问题以及对应的解决方案

    关于系统环境: Ubuntu 16.04 LTS cuda 8.0 cudnn 6.5 Anaconda3 编译pycaffe之前需要配置文件Makefile.config ## Refer to h ...

  6. Mac版 IntelliJ Idea使用系列(一)

    当连续import同一个包的多个类时,Idea会自动改成import xxx.*; 办法:修改Names count to use static import with '*'

  7. OpenStack虚拟机冷迁移与热迁移

    一.虚拟机迁移分析 openstacvk虚拟机迁移分为冷迁移和热迁移两种方式. 1.1冷迁移: 冷迁移(cold migration),也叫静态迁移.关闭电源的虚拟机进行迁移.通过冷迁移,可以选择将关 ...

  8. 【转载】c++类的实例化与拷贝

    https://www.cnblogs.com/chris-cp/p/3578976.html c++的默认拷贝构造函数,从深度拷贝和浅拷贝说起: https://blog.csdn.net/qq_2 ...

  9. python中的转义字符

    当我们需要在字符中添加特殊符号时,我们需要用\(即反斜杠来转义字符) 常用的转义字符: 注:如果不想转义添加的特殊字符,需要显示字符串原来的意思的时候,需要用r或R来定义 结果是这样的

  10. pc端,移动端css重置样式

    pc: html{font-family:"Microsoft YaHei UI","Microsoft YaHei",sans-serif;-ms-text- ...