https://codeforces.com/problemset/problem/553/A

dp+组合数学

dp[i] 放前i种颜色的方法数

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e3+7;
const ll mod = 1e9+7;
int a[N];
ll dp[N],f[N];
void work(){
f[0]=1;
f[1]=1;
for(int i=2;i<N;i++)
f[i]=f[i-1]*i%mod;
}
ll q_pow(ll a,ll n){
ll ans=1; ll base=a;
while(n){
if(n&1) ans=(ans*base)%mod;
base=base*base%mod;
n>>=1;
}
return ans;
}
ll inv(ll a,ll b){
return q_pow(a,b-2);
}
ll C(int n,int m){
return f[n]*inv(f[n-m]*f[m]%mod,mod)%mod;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int k; cin>>k;
for(int i=1;i<=k;i++){
cin>>a[i];
}
work();
int sum=a[1];
dp[1]=1;
for(int i=2;i<=k;i++){
dp[i]=(dp[i-1]*C(sum+a[i]-1,a[i]-1))%mod;
sum+=a[i];
}
cout<<dp[k]<<endl;
return 0;
}

https://codeforces.com/problemset/problem/264/B

dp+简单数论

dp[i] 表示当前当前位置因子为i的所能构成的序列长度

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5+7;
const ll mod = 1e9+7;
int a[N];
int dp[N];
vector<int> v[N];
void work(){
for(int i=2;i<N;i++)
for(int j=i;j<N;j+=i)
v[j].push_back(i);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n; cin>>n;
work();
for(int i=1;i<=n;i++) cin>>a[i];
v[1].push_back(1);
for(int i=1;i<=n;i++){
int tmp=0;
for(int j=0;j<v[a[i]].size();j++)
tmp=max(tmp,dp[v[a[i]][j]]);
for(int j=0;j<v[a[i]].size();j++)
dp[v[a[i]][j]]=tmp+1;
}
int ans=0;
for(int i=1;i<N;i++) ans=max(ans,dp[i]);
cout<<ans<<endl;
return 0;
}

http://codeforces.com/contest/339/problem/C

dp+路径还原

dp[i][j] 表示用了j克的砝码 变成了重量为i 是否存在

#include <bits/stdc++.h>
using namespace std;
const double pi = acos(-1.0);
const int N = 2e5+7;
const int inf = 0x3f3f3f3f;
const double eps = 1e-6;
typedef long long ll;
typedef pair<int,int> pii;
const ll mod = 1e9+7;
vector<int> w;
int dp[207][15];
pii path[1007][207][15];
void find(int x,int y,int cnt){
if(cnt==0) return ;
find(path[cnt][x][y].first,path[cnt][x][y].second,cnt-1);
cout<<y<<" ";
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
string s; cin>>s;
for(int i=0;i<10;i++) if(s[i]=='1') w.push_back(i+1);
int m; cin>>m;
int fix=100;
for(int i=0;i<w.size();i++){
dp[fix+w[i]][w[i]]=1;
path[1][fix+w[i]][w[i]]=make_pair(fix,0);
}
for(int i=2;i<=m;i++){
if(i&1){
for(int j=fix-50;j<fix;j++)
for(int k=0;k<w.size();k++)
if(dp[j][w[k]]){
// cout<<j<<" "<<w[k]<<endl;
for(int l=0;l<w.size();l++){
// cout<<j<<" "<<fix<<endl;
if(w[l]==w[k]||j+w[l]<=fix) continue;
dp[j+w[l]][w[l]]=1;
path[i][j+w[l]][w[l]]=make_pair(j,w[k]);
}
dp[j][w[k]]=0;
}
}else{
// cout<<"11"<<endl;
for(int j=fix+1;j<=fix+1+50;j++)
for(int k=0;k<w.size();k++)
if(dp[j][w[k]]){
// cout<<j<<" "<<w[k]<<endl;
for(int l=0;l<w.size();l++){
if(w[l]==w[k]||j-w[l]>=fix) continue;
dp[j-w[l]][w[l]]=1;
// cout<<j-w[l]<<endl;
path[i][j-w[l]][w[l]]=make_pair(j,w[k]);
}
dp[j][w[k]]=0;
}
}
}
if(m&1){
int x=-1,y=-1;
for(int i=fix+1;i<fix+1+50;i++)
for(int j=0;j<w.size();j++)
if(dp[i][w[j]]){
x=i; y=w[j];
break;
}
if(x==-1){
cout<<"NO\n";
}else{
cout<<"YES\n";
// cout<<x<<" "<<y<<endl;
find(x,y,m);
cout<<"\n";
}
}else{
int x=-1,y=-1;
for(int i=fix-50;i<fix;i++)
for(int j=0;j<w.size();j++)
if(dp[i][w[j]]){
x=i; y=w[j];
break;
}
if(x==-1){
cout<<"NO\n";
}else{
cout<<"YES\n";
// cout<<x<<" "<<y<<endl;
find(x,y,m);
cout<<"\n";
}
}
return 0;
}

https://codeforces.com/problemset/problem/977/F

dp+路径

dp[i]表示以i位置为结尾所能构成的最大连续个数 用一个map记录最后一个数为i的最大长度

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pi;
const int N = 2e5+7;
const ll mod = 1e9+7;
int a[N],dp[N],path[N];
map<int,pi> mm;
vector<int> v;
void find(int x){
if(!x) return ;
find(path[x]);
v.push_back(x);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n; cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
if(mm.count(a[i]-1)){
dp[i]=mm[a[i]-1].first+1;
mm[a[i]]=make_pair(dp[i],i);
path[i]=mm[a[i]-1].second;
}else{
dp[i]=1;
mm[a[i]]=make_pair(1,i);
}
}
int ans=0; int xx;
for(int i=1;i<=n;i++){
if(dp[i]>ans){
ans=dp[i];
xx=i;
}
}
find(xx);
cout<<ans<<"\n";
for(int i=0;i<v.size();i++)
cout<<v[i]<<" ";
cout<<"\n";
return 0;
}

https://codeforces.com/problemset/problem/711/C

dp[i][j][k] 表示前i个位置 最后一个数颜色为j 且分为k组的最小花费

#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const double eps = 1e-6;
const int N = 4e5+7;
typedef long long ll;
const ll mod = 1e9+7;
using namespace std;
int a[107];
ll cost[107][107];
ll dp[107][107][107];
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n,m,k; cin>>n>>m>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>cost[i][j];
memset(dp,0x3f3f3f3f3f3f3f3f,sizeof(dp));
for(int i=1;i<=n;i++){
for(int kk=1;kk<=k;kk++){
if(kk>i) break;
if(a[i]){
if(i==1){
dp[i][a[i]][1]=0;
continue;
}
dp[i][a[i]][kk]=dp[i-1][a[i]][kk];
for(int j=1;j<=m;j++){
if(j==a[i]) continue;
dp[i][a[i]][kk]=min(dp[i][a[i]][kk],dp[i-1][j][kk-1]);
}
}else{
if(i==1){
for(int j=1;j<=m;j++)
dp[i][j][1]=cost[1][j];
continue;
}
for(int j=1;j<=m;j++){
dp[i][j][kk]=dp[i-1][j][kk]+cost[i][j];
for(int l=1;l<=m;l++){
if(j==l) continue;
dp[i][j][kk]=min(dp[i][j][kk],dp[i-1][l][kk-1]+cost[i][j]);
}
}
}
}
}
ll ans=0x3f3f3f3f3f3f3f3f;
for(int i=1;i<=m;i++)
ans=min(ans,dp[n][i][k]);
if(ans==0x3f3f3f3f3f3f3f3f) cout<<"-1"<<endl;
else cout<<ans<<endl;
return 0;
}

http://codeforces.com/problemset/problem/279/C

dp[i][j]表示当前升上去或者降下来的最左点

#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const double eps = 1e-6;
const int N = 1e5+7;
typedef long long ll;
const ll mod = 1e9+7;
using namespace std;
int a[N];
int dp[N][2];
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n,m; cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
dp[1][0]=1; dp[1][1]=1;
for(int i=2;i<=n;i++){
if(a[i]<a[i-1]){
dp[i][0]=i;
dp[i][1]=dp[i-1][1];
}else if(a[i]>a[i-1]){
dp[i][0]=dp[i-1][0];
dp[i][1]=i;
}else{
dp[i][0]=dp[i-1][0];
dp[i][1]=dp[i-1][1];
}
}
for(int i=1;i<=m;i++){
int l,r; cin>>l>>r;
if(l<min(dp[dp[r][1]][0],dp[r][0])){
cout<<"No\n";
}else{
cout<<"Yes\n";
}
}
return 0;
}

dp practice 1的更多相关文章

  1. Hackerrank--Stock Maximize(DP Practice)

    题目链接 Your algorithms have become so good at predicting the market that you now know what the share p ...

  2. Codeforces 1076F Summer Practice Report dp

    Summer Practice Report dp[ i ][ 0 ]表示放完前 i 页, 第 i 页最后一段是 0, 0个数的最小值. dp[ i ][ 1 ]表示放完前 i 页, 第 i 页最后一 ...

  3. hdu 3401 单调队列优化DP

    Trade Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status ...

  4. LEETCODE —— Maximum Subarray [一维DP]

    Maximum Subarray Find the contiguous subarray within an array (containing at least one number) which ...

  5. HDU 1069 dp最长递增子序列

    B - Monkey and Banana Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I6 ...

  6. HDU 1160 DP最长子序列

    G - FatMouse's Speed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64 ...

  7. fzu2188 状压dp

    G - Simple String Problem Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & ...

  8. hdu1054 树形dp&&二分图

    B - Strategic Game Time Limit:10000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u ...

  9. hdu1520 树形dp Anniversary party

    A - Anniversary party Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I6 ...

随机推荐

  1. (解决)easypoi图片导出只占用一个单元格

    @ 目录 前提 依赖环境 问题原因 解决方案 重写jar中的方法 原理 前提 本解决方案来源于网络,因解决自己需求,因此自行记录起来,如有侵权请联系我. 依赖环境 easypoi--依赖版本3.1.0 ...

  2. 剑指offer 面试题10.2:青蛙变态跳台阶

    题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 编程思想 因为n级台阶,第一步有n种跳法:跳1级.跳2级.到跳n级跳1级,剩下 ...

  3. 【原创】X86_64汇编、寄存器、内嵌汇编

    整理的X86_64/X86汇编.寄存器.C内嵌汇编笔记,主要用于查阅使用. 目录 一.汇编语言 二.指令 数据传输指令 栈操作指令 push pop 运算指令 位操作 比较操作指令 标志寄存器 流控制 ...

  4. show engine innodb status

    TRANSACTIONS------------Trx id counter 2003909(当前事务号)Purge done for trx's n:o < 2003905 (清理线程完成到了 ...

  5. 【Linux】快速创建文件的命令方法

    [root@centos7 dir1]# ll total 0 -rw-r--r-- 1 root root 0 Aug 15 02:39 file1 -rw-r--r-- 1 root root 0 ...

  6. 【EXP】导出数据库dmp文件,只有几张表有数据,剩下的所有表只有表结构没有数据

    导出一个dmp,指定的表中有数据,其他的表只有表结构, 有数据的表只有几张,分别是A,B,C三张表,剩下的表都没有数据 思路: 导出一个111.dmp,所有的表都只是表结构 将111.dmp导入到新创 ...

  7. Over Permission - Pikachu

    概述: 如果使用A用户的权限去操作B用户的数据,A的权限小于B的权限,如果能够成功操作,则称之为越权操作. 越权漏洞形成的原因是后台使用了不合理的权限校验规则导致的. 一般越权漏洞容易出现在权限页面( ...

  8. kubectl工具管理应用

    kubectl工具管理应用 创建一个pod [root@k8s-master ~]# kubectl run nginx --replicas=3 --labels="app=nginx-e ...

  9. 使用call、apply、bind继承及三者区别

    js里的继承方法有很多,比如:使用原型链的组合继承.es6的Class.寄生继承以及使用call.apply.bind继承.再说继承之前,我们先简单了解下它们的区别. 一.区别: 同:三者都是改变函数 ...

  10. 三十二:WEB漏洞-文件操作之文件下载读取全解

    文件下载读取 原路,检测,利用,修复 利用 数据库配置文件下载或者读取后续 接口密钥信息文件下载或者读取后续 文件名,参数值,目录符号 read.xxx?filename= down.xxx?file ...