标签:pen ace void 方向 getc 矩阵 数据 描述 clu
当发现自己竟然不会打dp的时候内心是崩溃的,然后按照一年前的刷题记录刷openjudge,然后发现自己准确率比一年前(刚学信竞两个月时)的准确率低得多,已经没救。
列一下最近打的几道sb题
//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=30;
int n,t,tot,a[maxn],dp[maxn][1010];
int aa;char cc;
int read() {
aa=0;cc=getchar();
while(cc<‘0‘||cc>‘9‘) cc=getchar();
while(cc>=‘0‘&&cc<=‘9‘) aa=aa*10+cc-‘0‘,cc=getchar();
return aa;
}
int main() {
n=read();t=read();
for(int i=1;i<=n;++i) {
a[i]=read();
if(a[i]>t) i--,n--;
else tot+=a[i];
}
if(tot<t) {
printf("0"); return 0;
}
dp[0][0]=1;
for(int i=1;i<=n;++i) {
for(int j=0;j<=t-a[i];++j) if(dp[i-1][j]) dp[i][j+a[i]]+=dp[i-1][j];
for(int j=0;j<=t;++j) dp[i][j]+=dp[i-1][j];
}
printf("%d",dp[n][t]);
return 0;
}
//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=1000+10;
int T,dp[maxn][maxn],lena,lenb;
char a[maxn],b[maxn];
int main() {
scanf("%d",&T);
while(T--) {
memset(dp,0x3f3f3f3f,sizeof(dp));
scanf("%s%s",a+1,b+1);
lena=strlen(a+1); lenb=strlen(b+1);
for(int i=0;i<=lena||i<=lenb;++i) dp[0][i]=dp[i][0]=i;
for(int i=1;i<=lena;++i) for(int j=1;j<=lenb;++j) {
if(a[i]==b[j]) dp[i][j]=min(dp[i-1][j-1],dp[i][j]);//直接配对
else dp[i][j]=min(dp[i-1][j-1]+1,dp[i][j]);//替换
dp[i][j]=min(dp[i][j-1]+1,dp[i][j]);//插入
dp[i][j]=min(dp[i-1][j]+1,dp[i][j]);
}
printf("%d\n",dp[lena][lenb]);
}
return 0;
}
//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=1000+10,maxnum=1e4+10;
int n,x,sz[maxnum],num[maxnum],ans,nowans;
int aa;char cc;
int read() {
aa=0;cc=getchar();
while(cc<‘0‘||cc>‘9‘) cc=getchar();
while(cc>=‘0‘&&cc<=‘9‘) aa=aa*10+cc-‘0‘,cc=getchar();
return aa;
}
int lb(int x) {
return x&(-x);
}
int rs;
int q(int pos) {
rs=0;
while(pos) {
rs=max(rs,sz[pos]);
pos-=lb(pos);
}
return rs;
}
void chge(int pos,int x) {
while(pos<=1e4) {
sz[pos]=max(sz[pos],x);
pos+=lb(pos);
}
}
int main() {
n=read();
for(int i=1;i<=n;++i) {
x=read();
if(x) nowans=q(x-1)+x;
else nowans=0;
ans=max(ans,nowans);
if(nowans>num[x]) {
num[x]=nowans;
chge(x,nowans);
}
}
printf("%d",ans);
return 0;
}
//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=1e5+10,INF=1e7;
int T,n,a[maxn],dd[maxn];
int aa,ff;char cc;
int read() {
aa=0;cc=getchar();ff=1;
while(cc<‘0‘||cc>‘9‘) {
if(cc==‘-‘) ff=-1;
cc=getchar();
}
while(cc>=‘0‘&&cc<=‘9‘) aa=aa*10+cc-‘0‘,cc=getchar();
return aa*ff;
}
int main() {
T=read(); int num,ans,maxnum;
while(T--) {
n=read();ans=0;num=INF;maxnum=0;
for(int i=1;i<=n;++i) {
a[i]=read();
num=min(num,a[i]);
dd[i]=max(a[i]-num,dd[i-1]);
}
num=-INF;
for(int i=n;i;--i) {
num=max(num,a[i]);
maxnum=max(maxnum,num-a[i]);
ans=max(ans,dd[i]+maxnum);
}
printf("%d\n",ans);
}
return 0;
}
//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=30;
int n,dp[maxn][5];
int main() {
scanf("%d",&n);
dp[1][0]=dp[1][1]=dp[1][2]=1;
for(int i=2;i<=n;++i) {
dp[i][0]=dp[i-1][0]+dp[i-1][1]+dp[i-1][2];
dp[i][1]=dp[i-1][0]+dp[i-1][1];
dp[i][2]=dp[i-1][0]+dp[i-1][2];
}
printf("%d",dp[n][0]+dp[n][1]+dp[n][2]);
return 0;
}
标签:pen ace void 方向 getc 矩阵 数据 描述 clu
原文地址:http://www.cnblogs.com/Serene-shixinyi/p/7474988.html