kuangbin带你飞:点击进入新世界
简单dp,最近在做,持续更新。
原题链接:传送门
思路:
#include
#include
#include
#include
#define ll unsigned long long
#define inf 1<<30
using namespace std;
const int manx=1e6+5;
int a[manx],dp[manx],f[manx];
int main()
{
int n,m;
while(scanf("%d%d",&m,&n)!=EOF) //数据较大,用scanf,不然会超时
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int maxx;
memset(dp,0,sizeof(dp));
memset(f,0,sizeof(f));
for(int i=1;i<=m;i++)
{
maxx=-inf;
for(int j=i;j<=n;j++) //分成i组的话那么必须从i开始
{
dp[j]=max(dp[j-1]+a[j],f[j-1]+a[j]);
//f[j-1]是前面j-1个数取i-1组的最大值
//dp[j-1]是前面j-1个数取i组的最大值
//那么dp[j]就是j个数分i组的最大值
f[j-1]=maxx;
//这里j-1是因为maxx是上个循环得到的,就是前面dp[j-1]和maxx的较大值
maxx=max(dp[j],maxx);
//假设当前是循环到i组的时候,这个f数组是会在i+1组的时候用到
}
}
printf("%d\n",maxx);
}
return 0;
}
原题链接:传送门
思路:
#include
#include
#include
#include
#include
#define ll unsigned long long
#define inf 1<<30
using namespace std;
const int manx=1e6+5;
int a[manx];
map<int,int>mp;
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
mp.clear();
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
mp[a[i]]++;
}
for(int i=1;i<=n;i++)
if(mp[a[i]]>=(n+1)/2)
{
printf("%d\n",a[i]);
break;
}
}
return 0;
}
原题链接:传送门
思路:
#include
#include
#include
#include
#include
#define ll unsigned long long
#define inf 1<<30
using namespace std;
const int manx=1000;
int dp[manx];
struct node{
int l,r,w;
}a[manx];
bool cmp(node a,node b){
if(a.l==b.l) return a.r<b.r;
return a.l<b.l;
}
int main()
{
int n,t=1;
while(scanf("%d",&n)!=EOF)
{
if(!n) break;
int index=1;
for(int i=1;i<=n;i++)
{
int l,r,w;
scanf("%d%d%d",&l,&r,&w);
a[index].l=l,a[index].r=r,a[index++].w=w;
a[index].l=l,a[index].r=w,a[index++].w=r;
a[index].l=r,a[index].r=l,a[index++].w=w;
a[index].l=r,a[index].r=w,a[index++].w=l;
a[index].l=w,a[index].r=l,a[index++].w=r;
a[index].l=w,a[index].r=r,a[index++].w=l;
}
sort(a+1,a+1+index,cmp);
memset(dp,0,sizeof(dp));
int ans=0;
for(int i=1;i<index-1;i++){
for(int j=i;j<index;j++)
if(a[i].l<a[j].l&&a[i].r<a[j].r)
dp[j]=max(dp[j],dp[i]+a[j].w),ans=max(ans,dp[j]);
}
cout<<"Case "<<t++<<": maximum height = "<<ans<<endl;
}
return 0;
}
原题链接:传送门
思路:
#include
#include
#include
#include
#include
#define ll unsigned long long
#define inf 1<<30
using namespace std;
const int manx=1e6+5;
int a[manx],dp[manx];
int main()
{
int n,t=1;
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]),dp[i]=1;
int ans=0;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
if(a[j]>a[i])
dp[j]=max(dp[i]+1,dp[j]);
ans=max(ans,dp[i]);
}
cout<<ans<<endl;
}
return 0;
}
原题链接:传送门
思路:
#include
#include
#include
#include
#include
#define ll unsigned long long
#define inf 1<<30
using namespace std;
const int manx=1e6+5;
int a[manx],dp[manx];
int main()
{
int n,t=1;
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]),dp[i]=1;
int ans=0;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
if(a[j]>a[i])
dp[j]=max(dp[i]+1,dp[j]);
ans=max(ans,dp[i]);
}
cout<<ans<<endl;
}
return 0;
}
原题链接:传送门
思路:
#include
#include
#include
#include
#include
#define ll unsigned long long
#define inf 1<<30
using namespace std;
const int manx=1e3+5;
string s1,s2;
int dp[manx][manx];
int main()
{
int n,t=1;
while(scanf("%s%s",&s1,&s2)!=EOF)
{
memset(dp,0,sizeof(dp));
for(int i=1;i<=s1.size();i++)
for(int j=1;j<=s2.size();j++)
if(s1[i-1]==s2[j-1])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
cout<<dp[s1.size()][s2.size()]<<endl;
}
return 0;
}
原题链接:传送门
思路:
#include
#include
#include
#include
#include
#define ll unsigned long long
#define inf 1<<30
using namespace std;
const int manx=1e3+5;
int dp[manx];
int a[manx];
int main()
{
int n,t=1;
while(scanf("%d",&n)!=EOF)
{
if(!n) break;
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
scanf("%d",&a[i]),dp[i]=a[i];
int ans=0;
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++)
if(a[j]>a[i])
dp[j]=max(dp[j],dp[i]+a[j]);
ans=max(ans,dp[i]);
}
cout<<ans<<endl;
}
return 0;
}
原题链接:传送门
思路:
#include
#include
#include
#include
#include
#define ll unsigned long long
#define inf 1<<30
using namespace std;
const int manx=1e3+5;
int dp[manx];
struct node{
int l,r,w;
}a[manx];
bool cmp(node a,node b){
return a.l<b.l;
}
int main()
{
int n,m,r,t=1;
while(scanf("%d%d%d",&n,&m,&r)!=EOF)
{
for(int i=1;i<=m;i++){
cin>>a[i].l>>a[i].r>>a[i].w;
a[i].r+=r;
}
sort(a+1,a+1+m,cmp);
int ans=0;
for(int i=1;i<=m;i++)
dp[i]=a[i].w;
for(int i=1;i<=m;i++){
for(int j=i+1;j<=m;j++)
if(a[j].l>=a[i].r)
dp[j]=max(dp[j],dp[i]+a[j].w);
ans=max(ans,dp[i]);
}
cout<<ans<<endl;
}
return 0;
}
原题链接:传送门
思路:
#include
#include
#include
#include
#include
#define ll unsigned long long
#define inf 1<<30
using namespace std;
const int manx=2e3+5;
int dp[manx][manx],a[manx][manx];
int dx[4]={0,0,-1,1},dy[4]={1,-1,0,0};
int n,m,r,t=1;
int dfs(int x,int y){
if(dp[x][y]) return dp[x][y];
int mx=0;
for(int i=1;i<=m;i++){
for(int j=0;j<4;j++){
int xx=x+dx[j]*i,yy=y+dy[j]*i;
if(a[x][y]<a[xx][yy]&&xx>0&&yy>0&&xx<=n&&yy<=n)
mx=max(dfs(xx,yy),mx);
}
}
return dp[x][y]=a[x][y]+mx;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==-1&&m==-1) break;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
memset(dp,0,sizeof(dp));
cout<< dfs(1,1)<<endl;
}
return 0;
}
原题链接:传送门
思路:
#include
#include
#include
#include
#include
#define ll unsigned long long
#define inf 1<<30
using namespace std;
const int manx=2e3+5;
int dp[manx][manx];
char c[manx][manx];
int n,m,r,t=1;
int main()
{
while(scanf("%d",&n)!=EOF)
{
if(!n) break;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>c[i][j];
memset(dp,0,sizeof(dp));
int ans=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
dp[i][j]=1;
int x=i,y=j;
while(c[i][y]==c[x][j]) x--,y++;
if(c[i][j+1]==c[i-1][j])
dp[i][j]=min(dp[i-1][j+1],i-x-1)+1;
ans=max(ans,dp[i][j]);
}
cout<<ans<<endl;
}
return 0;
}
原题链接:传送门
思路:
#include
#include
#include
#include
#include
#include
#define ll unsigned long long
#define inf 1<<30
using namespace std;
const int manx=2e3+5;
int dp[manx],q[manx];
struct node {
int w,v,x;
}a[manx];
bool cmp(node a,node b){
if(a.w==b.w) return a.v>b.v;
return a.w<b.w;
}
int n,m,r,t=0;
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
a[++t].w=n,a[t].v=m,a[t].x=t;
}
sort(a+1,a+t+1,cmp);
int ans=0;
for(int i=t;i>=1;i--){
dp[i]=1;
for(int j=i+1;j<=t;j++)
if(a[j].w>a[i].w&&a[j].v<a[i].v)
dp[i]=max(dp[j]+1,dp[i]);
ans=max(dp[i],ans);
}
cout<<ans<<endl;
for(int i=1;i<=t;i++){
if(dp[i]==ans)
cout<<a[i].x<<endl,ans--;
}
return 0;
}
原题链接:传送门
思路:
#include
#include
#include
#include
#include
#include
#define ll unsigned long long
#define inf 1<<30
using namespace std;
const int manx=1e5+5;
int dp[manx][15];
int a[manx][15];
int n,m,r,t=0;
int main()
{
while(scanf("%d",&n)!=EOF)
{
if(!n) break;
memset(dp,0,sizeof(dp));
memset(a,0,sizeof(a));
int e=0;
for(int i=1;i<=n;i++){
int x,t;
scanf("%d%d",&x,&t);
a[t][++x]++;
e=max(e,t);
}
for(int i=e;i>=0;i--)
for(int j=1;j<=11;j++)
dp[i][j]=max(dp[i+1][j-1],
max(dp[i+1][j],dp[i+1][j+1]))+
a[i][j];
printf("%d\n",dp[0][6]);
}
return 0;
}
原题链接:传送门
思路:
#include
#include
#include
#include
#include
#include
#define ll unsigned long long
#define inf 1<<30
using namespace std;
const int manx=2e3+5;
int a[manx],b[manx],dp[manx];
int n,m,r,t=0;
int main()
{
while(scanf("%d",&t)!=EOF)
{
while(t--){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=2;i<=n;i++) cin>>b[i];
dp[1]=a[1];
for(int i=2;i<=n;i++)
dp[i]=min(dp[i-1]+a[i],dp[i-2]+b[i]);
int h=8,mi=0,sec=0;
sec+=dp[n];
mi+=sec/60%60;
h+=sec/3600;
sec%=60;
printf("%02d:%02d:%02d ",h,mi,sec);
if(h>=12) printf("pm\n");
else printf("am\n");
}
}
return 0;
}