入口

UVALive - 3882

#include<cstdio>
using namespace std;
const int N=1e4+;
int n,m,k,f[N];
int main(){
//f[i]表示第i次要删的数字
while(scanf("%d%d%d",&n,&k,&m)==&&n){
//1
//f[1]=0;
//for(int i=2;i<=n;i++) f[i]=(f[i-1]+k)%i;
//int ans=(m-k+f[n]+1)%n;
//2
//int s=0;
//for(int i=2;i<=n;i++) s=(s+k)%i;
//int ans=(m-k+s+1)%n;//这3句话来源于上面
//if(ans<=0) ans+=n;
//printf("%d\n",ans);
//
int s=;
for(int i=;i<n;i++) s=(s+k)%i;
s=(s+m)%n;
printf("%d\n",s+);
}
return ;
}

UVA - 10635

//turn to lis
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e5+;
int T,cas=,n,p,q,pa[N],a[N],b[N],c[N];
inline void LIS(){
int len;c[len=]=b[];
for(int i=,pos;i<=q+;i++){
if(b[i]>c[len]) c[++len]=b[i];
else{
pos=lower_bound(c+,c+len+,b[i])-c;
c[pos]=b[i];
}
}
printf("Case %d: %d\n",cas,len);
}
int main(){
for(scanf("%d",&T);cas<=T;cas++){
scanf("%d%d%d",&n,&p,&q);
for(int i=;i<=p+;i++) scanf("%d",&a[i]),pa[a[i]]=i;
for(int i=;i<=q+;i++) scanf("%d",&b[i]),b[i]=pa[b[i]];
LIS();
}
return ;
}
/*//lcs->TLE
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N=1e5+5;
int T,cas=1,n,p,q,a[N],b[N],f[2][N*10];
int main(){
for(scanf("%d",&T);cas<=T;cas++){
scanf("%d%d%d",&n,&p,&q);
for(int i=1;i<=p+1;i++) scanf("%d",&a[i]);
for(int i=1;i<=q+1;i++) scanf("%d",&b[i]);
memset(f,0,sizeof f);int now=0;
for(int i=1;i<=p+1;i++){
now^=1;
for(int j=1;j<=q+1;j++){
if(a[i]==b[j]) f[now][j]=f[now^1][j-1]+1;
else f[now][j]=max(f[now][j-1],f[now^1][j]);
}
}
printf("Case %d:%d\n",cas,f[now][q+1]);
}
return 0;
} */

UVA - 10891

//朴素(AC)
#include<cstdio>
#include<cstring>
//dp(i,j)表示选择[i,j]的子序列,在双方都采取最优策略,先手得分的最大值
//dp(i,j)=sum(i,j)-min{d(i+1,j)……d(j,j),d(i,j-1)……d(i,i)}
#include<algorithm>
using namespace std;
const int N=;
int n,s[N],f[N][N];
bool vis[N][N];
int dp(int x,int y){
if(vis[x][y]) return f[x][y];
vis[x][y]=;
int m=;//全部取光(精髓)
for(int i=x+;i<=y;i++) m=min(m,dp(i,y));
for(int i=x;i<y;i++) m=min(m,dp(x,i));
return f[x][y]=s[y]-s[x-]-m;
}
int main(){
while(scanf("%d",&n)==&&n){
for(int i=;i<=n;i++) scanf("%d",&s[i]),s[i]+=s[i-];
memset(vis,,sizeof vis);
printf("%d\n",*dp(,n)-s[n]);
}
return ;
}
//辅助数组优化
//f(i,j)=min{d(i,j),d(i+1,j)……d(j,j)}
//g(i,j)=min{d(i,j),d(i,j-1)……d(i,i)}
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
int n,a[N],s[N],f[N][N],g[N][N],dp[N][N];
int main(){
while(scanf("%d",&n)==&&n){
memset(f,,sizeof f);
memset(g,,sizeof g);
for(int i=;i<=n;i++) scanf("%d",&a[i]),f[i][i]=g[i][i]=dp[i][i]=a[i];
for(int i=;i<=n;i++) s[i]=s[i-]+a[i];
for(int L=;L<n;L++){
for(int i=;i+L<=n;i++){
int j=i+L;
int m=;
m=min(m,f[i+][j]);
m=min(m,g[i][j-]);
dp[i][j]=s[j]-s[i-]-m;
f[i][j]=min(dp[i][j],f[i+][j]);
g[i][j]=min(dp[i][j],g[i][j-]);
}
}
printf("%d\n",*dp[][n]-s[n]);
}
return ;
}

UVA - 11825

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N=<<;
int n,cas;
int p[N],cover[N],f[N];
int main(){
while(scanf("%d",&n)==&&n){
memset(p,,sizeof p);
memset(cover,,sizeof cover);
for(int i=,m,x;i<n;i++){
scanf("%d",&m);
p[i]=<<i;
while(m--) scanf("%d",&x),p[i]|=(<<x);
}
for(int S=;S<(<<n);S++){
cover[S]=;
for(int i=;i<n;i++) if(S&(<<i)) cover[S]|=p[i];
}
//dp transfer equation:
//f(S)=max{f(S-S0)|S0 belong to S,and cover[S0]==ALL}
int ALL=(<<n)-;f[]=;
for(int S=;S<(<<n);S++){
f[S]=;
for(int S0=S;S0;S0=(S0-)&S){
if(cover[S0]==ALL) f[S]=max(f[S],f[S^S0]+);
}
}
printf("Case %d: %d\n",++cas,f[ALL]);
}
return ;
}

UVA - 10859

#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int N=;
const int M=;
int n,m,T,f[N][N];bool vis[N][N];
vector<int>graph[N];
int dp(int i,int j,int fa){
if(vis[i][j]) return f[i][j];
vis[i][j]=;
int &ans=f[i][j];
ans=M;
//1:now point with light
for(int k=;k<graph[i].size();k++){
if(graph[i][k]!=fa){
ans+=dp(graph[i][k],,i);
}
}
if(!j&&fa>=) ans++;//not root
if(j||fa<){
//2:now point without light
int sum=;
for(int k=;k<graph[i].size();k++){
if(graph[i][k]!=fa){
sum+=dp(graph[i][k],,i);
}
}
if(fa>=) sum++;//not root
ans=min(ans,sum);
}
return ans;
}
int main(){
for(scanf("%d",&T);T--;){
scanf("%d%d",&n,&m);
for(int i=;i<n;i++) graph[i].clear();
for(int i=,x,y;i<m;i++){
scanf("%d%d",&x,&y);
graph[x].push_back(y);
graph[y].push_back(x);
}
memset(vis,,sizeof vis);
int ans=;
for(int i=;i<n;i++){
if(!vis[i][]){
ans+=dp(i,,-);
}
}
//ans=Ma+b;beacause DAG
printf("%d %d %d\n",ans/M,m-ans%M,ans%M);
}
return ;
}

UVALive - 3983

#include<cstdio>
using namespace std;
const int N=1e5+;
int T,c,n,x[N],y[N];
int dist2origin[N],total_dist[N],total_wight[N];
int q[N],f[N];
inline int ABS(int x){
return x>?x:-x;
}
//dp[i]=min{dp[j]+dist2origin[j+1]+dist[j+1,i]+dist2origin[i]|j<=i,w[j+1,i]<=c}
//==>min{dp[j]+dist2origin[j+1]-total_dist[j+1]}+total_dist[i]+dist2origin[i]
// (let total_dist[i]=w1+w2+……+wi,then dist[j+1,i]=total_dist[i]-total_dist[j+1])
//==>min{func(j)}+total_dist[i]+dist2origin[i];
// (let func(j)=dp[j]+dist2origin[j+1]-total_dist[j+1])
//use humdrum queue to optimize time.(finised)
inline int func(int j){
return f[j]+dist2origin[j+]-total_dist[j+];
}
int main(){
for(scanf("%d",&T);T--;){
scanf("%d%d",&c,&n);
dist2origin[]=total_dist[]=total_wight[]=x[]=y[]=;
for(int i=,w;i<=n;i++){
scanf("%d%d%d",&x[i],&y[i],&w);
dist2origin[i]=ABS(x[i])+ABS(y[i]);
total_dist[i]=total_dist[i-]+ABS(x[i]-x[i-])+ABS(y[i]-y[i-]);
total_wight[i]=total_wight[i-]+w;
}
int h=,t=;
for(int i=;i<=n;i++){
for(;h<t&&total_wight[i]-total_wight[q[h]]>c;h++);
f[i]=func(q[h])+total_dist[i]+dist2origin[i];
for(;h<t&&func(i)<=func(q[t]);t--);
q[++t]=i;
}
printf("%d\n",f[n]);
if(T>) putchar('\n');
}
return ;
}

UVALive - 4794

//dp transfer equation:
//dp(r,c,S)
//1 dp(r0,c,S0)=dp(r-r0,c,S-S0){1<=r0<r}
//2 dp(r,c0,S0)=dp(r,c-c0,S-S0){1<=c0<c}
//3 dp(r,c,S)=dp(c,r,S)
//use g(r,S) take place of dp(r,c,S){r<=c}, and judge whether is legal or not.
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int N=,M=;
int T,n,cas,x,y,a[N],sum[<<N];
bool f[<<N][M],vis[<<N][M];
int bitcount(int x){
return !x?:bitcount(x>>)+(x&);
}
bool dp(int S,int x){
if(vis[S][x]) return f[S][x];
vis[S][x]=;
bool &ans=f[S][x];
if(bitcount(S)==) return ans=;
int y=sum[S]/x;
for(int S0=(S-)&S;S0;S0=(S0-)&S){
int S1=S-S0;
if(!(sum[S0]%x)&&dp(S0,min(x,sum[S0]/x))&&dp(S1,min(x,sum[S1]/x))) return ans=;
if(!(sum[S0]%y)&&dp(S0,min(y,sum[S0]/y))&&dp(S1,min(y,sum[S1]/y))) return ans=;
}
return ans=;
}
int main(){
while(scanf("%d",&n)==&&n){
scanf("%d%d",&x,&y);
memset(vis,,sizeof vis);
memset(f,,sizeof f);
for(int i=;i<n;i++) scanf("%d",&a[i]);
for(int S=;S<(<<n);S++){
sum[S]=;
for(int i=;i<n;i++){
if(S&(<<i)) sum[S]+=a[i];
}
}
int ALL=(<<n)-;bool ans;
if(sum[ALL]!=x*y||sum[ALL]%x) ans=;
else ans=dp(ALL,min(x,y));
printf("Case %d: %s\n",++cas,ans?"Yes":"No");
}
return ;
}

大白第一章第四节dp例题的更多相关文章

  1. tensorflow2.0学习笔记第一章第四节

    1.4神经网络实现鸢尾花分类 import tensorflow as tf from sklearn import datasets import pandas as pd import numpy ...

  2. 实验楼学习linux第一章第四节linux目录结构及文件基本操作

    linux目录结构及文件基本操作 常用命令 切换目录 cd 当前目录 . 上一级目录 .. (.和..开头的都是隐藏文件) 查看隐藏文件 ls -a 上一级所在目录 - 当前用户home目录 ~ 获取 ...

  3. NHibernate.3.0.Cookbook第一章第六节Handling versioning and concurrency的翻译

    NHibernate.3.0.Cookbook第一章第六节Handling versioning and concurrency的翻译   第一章第二节Mapping a class with XML ...

  4. 【软件构造】第三章第四节 面向对象编程OOP

    第三章第四节 面向对象编程OOP 本节讲学习ADT的具体实现技术:OOP Outline OOP的基本概念 对象 类 接口 抽象类 OOP的不同特征 封装 继承与重写(override) 多态与重载( ...

  5. 微信小程序教学第三章第四节(含视频):小程序中级实战教程:下拉更新、分享、阅读标识

    下拉更新.分享.阅读标识 本文配套视频地址: https://v.qq.com/x/page/h0554i4u5ob.html 开始前请把 ch3-4 分支中的 code/ 目录导入微信开发工具 这一 ...

  6. NHibernate.3.0.Cookbook第一章第五节Setting up a base entity class

    Setting up a base entity class设置一个实体类的基类 在这节中,我将给你展示怎么样去为我们的实体类设置一个通用的基类. 准备工作 完成前面三节的任务 如何去做 1.在Ent ...

  7. 第一百一十四节,JavaScript文档对象,DOM进阶

    JavaScript文档对象,DOM进阶 学习要点: 1.DOM类型 2.DOM扩展 3.DOM操作内容 DOM自身存在很多类型,在DOM基础课程中大部分都有所接触,比如Element类型:表示的是元 ...

  8. Solr In Action 中文版 第一章(四、五)

    1.1             功能概览1. 4 最后,让我们再依照以下的分类.高速的过一下Solr的主要功能: ·用户体验 ·数据建模 ·Solr 4的新功能 在本书中.为你的用户提供良好的搜索体验 ...

  9. sencha touch 在线实战培训 第一期 第四节

    2014.1.4晚上8点开的课 第一节收费课程,还是有几位同学付费了,这些课程也录像了的,以后也会持续销售. 本期培训一共八节,前三堂免费,后面的课程需要付费才可以观看. 本节内容:          ...

随机推荐

  1. 解决mysql 远程链接问题

    grant all privileges on *.* to 'root'@'192.168.2.204' identified by '123456' with grant option;flush ...

  2. Bystack的高TPS共识算法

    共识算法是分布式系统保证节点数据状态一致性的方法,在区块链的共识算法分POW(工作量证明)和POS(权益证明)两大类.第一类POW模式是在公链项目中运用的最广泛应用的共识算法,比特币长达10年的运行已 ...

  3. poj 3140 Contestants Division [DFS]

    题意:一棵树每个结点上都有值,现删掉一条边,使得到的两棵树上的数值和差值最小. 思路:这个题我直接dfs做的,不知道树状dp是什么思路..一开始看到数据规模有些后怕,后来想到long long 可以达 ...

  4. 2016北京集训测试赛(十七)Problem C: 数组

    Solution 线段树好题. 我们考虑用last[i]表示\(i\)这个位置的颜色的上一个出现位置. 考虑以一个位置\(R\)为右端点的区间最远能向左延伸到什么位置: \(L = \max_{i \ ...

  5. servlet与线程与jdbc connection的关系

    servlet与线程与jdbc connection的关系 都是一一绑定的关系, servlet接受那么多此请求. 一个请求,对应一个线程,对应一个DB POOL的connection. 因为conn ...

  6. 【mybatis】从一个错误,看mybatis中的#和$的区别

    事情的发展是这样的: 因为一个需求,需要在java中拼接出一个完整的sql语句,然后将整条sql语句传递给mybatis执行. mapper.java是这样的: int insertMaster(Wo ...

  7. Unity -- 材质-Material和预设体-Prefabs

    材质(Materials)用来把网格(Mesh)或粒子渲染器(Particle Renderers)贴到游戏对象上.他们在定义对象怎么被显示发挥重要组成部分.材质包括用于呈现网状或颗粒着色器的参考,所 ...

  8. Android 两种注册、发送广播的区别

    前言:前面文章记录了Service的使用,这次来记录另一个四个组件之一的BroadcastReceiver.主要介绍两种发送和注册广播的区别. BroadcastReceiver广播接收者用于接收系统 ...

  9. Java架构师与开发者提高效率的10个工具

    Java受到全球百万计开发者的追捧,已经演变为一门出色的编程语言.最终,这门语言随着技术的变化,不断的被改善以迎合变化的市场需求. 无论你是否拥有一家科技公司,软件已经成为几乎每一个企业不可或缺的一部 ...

  10. nginx+keepalived实现双机热备高可用性

    搭建准备: 机器两台 ip分别为192.168.100.128 192.168.100.129(能够用虚拟机測试.虚拟机网络模式为NET模式.且为静态ip) 另外须要准备一个虚拟ip对外提供服务.即通 ...