ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

狂人日记

2020-12-23 09:02:44  阅读:172  来源: 互联网

标签:狂人日记 int scanf namespace main 1002 dp


///最大团

#include<bits/stdc++.h>
using namespace std;
int a[100][100];    
int x[100]; 
int n;  
int cn; 
int bestn;  

void backtrack(int i)
{
    if(i > n){
        bestn = cn;
        return;
    }
    
    int OK = 1;
    for(int j=1; j<i; j++){
        if(x[j] == 1 && a[i][j] == 0){  
            OK = 0;
            break;
        }
    }
    if(OK){ 
        x[i] = 1;
        cn++;
        backtrack(i+1);
        x[i] = 0;
        cn--;
    }
    if(cn+n-i > bestn){
        x[i] = 0;
        backtrack(i+1);
    }
}
int main()
{
    int t,m,u,v;
    scanf("%d",&t);
    for(int k=1; k<=t; k++)
    {
        cn = 0;
        bestn = 0;
        memset(a,0,sizeof(a));
        scanf("%d%d",&n,&m);
        for(int j=1; j<=m; j++){
            scanf("%d%d",&u,&v);
            a[u][v] = 1;
            a[v][u] = 1;
        }
        backtrack(1);
        printf("Case %d: %d\n",k,bestn);
    }
}
///子集和

#include<bits/stdc++.h>
using namespace std;
int n;
int c; 
int num[8000]; 
int x[8000];    
int bestIndex;
int flag=0; 
void backtract(int k,int s,int r){
    if(k>n){
        return;
    }
    x[k]=1;
    if(flag==0&&s+num[k]==c){
        for(int i=0;i<=k;i++){
            if(x[i]!=0){
                printf("%d ",num[i]);
            }
        }
        flag=1;
        printf("\n");
        return;
    }
    else if(s+num[k]+num[k+1]<=c&&flag==0){ 
        backtract(k+1,s+num[k],r-num[k]);
    }
    if(s+num[k+1]<=c&&s+r-num[k]>=c&&flag==0){
        x[k]=0;
        backtract(k+1,s,r-num[k]);
    }
    return;
}
int main()
{
    int r=0;  
    scanf("%d%d",&n,&c);
    for(int i=0;i<n;i++){
        scanf("%d",&num[i]);
        r+=num[i];
    }
    sort(num,num+n);
    backtract(0,0,r);
    if(flag==0){
        printf("No Solution!\n");
    }
    return 0;
}
///最大子矩阵和

#include<bits/stdc++.h>
using namespace std;
int ans(int g,int q[]){
   int cut=0;
   int ch=0;
    for(int i=1;i<=g;i++){
        if(ch>0)
        ch+=q[i];
        else
        ch=q[i];
        if(ch>cut)
        cut=ch;
    }
    return cut;
}
int main(){
     int n,m;
     int i,j,k;
     int a[401][401];
     while(~scanf("%d%d",&n,&m)){
     for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        scanf("%d",&a[i][j]);
     int sum=0;
     int b[401];
     for(i=1;i<=n;i++)
     {
        for(k=1;k<=m;k++)
           b[k]=0;
      for(j=i;j<=n;j++){
        for(k=1;k<=m;k++)
            b[k]+=a[j][k];
            int Max=ans(m,b);
            if(Max>sum)
                sum=Max;
        }
        }
        printf("%d\n",sum);
    }
     return 0;
}
///最长上升子序列

#include<bits/stdc++.h>
using namespace std;
int a[3002],b[3002],dp[3002];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    int pos=1,maxx=1;
    for(int i=1;i<=n;i++){
        dp[i]=1;
        for(int j=1;j<i;j++){
            if(a[i]>a[j]){
                dp[i]=max(dp[i],dp[j]+1);
                if(dp[i]>=maxx)
                    pos=i;
                maxx=max(maxx,dp[i]);
            }
        }
    }
    printf("%d\n",maxx);
    b[1]=a[pos];
    int count=1;
    for(int i=pos-1;i>=1;i--){
        if(dp[i]==maxx-1){
            b[++count]=a[i];
            maxx=dp[i];
        }
    }
    for(int i=count;i>=1;i--){
        printf("%d ",b[i]);
    }
}
///矩阵连乘

#include<stdio.h>
int p[602],m[602][602];
int main()
{
    int t,n;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d %d",&p[i-1],&p[i]);
        }
        for(int i=1; i<=n; i++)
            m[i][i]=0;
        for(int r=2; r<=n; r++){
            for(int i=1; i<=n-r+1; i++){
                int j=i+r-1;
                m[i][j]=m[i+1][j] + p[i-1]*p[i]*p[j];
                for(int k=i+1; k<j; k++){
                    int x=m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j];
                    if(x<m[i][j]){
                        m[i][j]=x;
                    }
                }
            }
        }
        printf("%d\n", m[1][n]);
    }
}
///是否可达

#include<bits/stdc++.h>
using namespace std;
#define MAX 1003
int q[MAX][MAX],que[MAX];
int n,e,d;

void backtrack(int x,int y)
{
    if(x==y){   ///出口
        d=1;
    }
    que[x]=1;
    for(int i=1; i<=n; i++){
        if(q[x][i]==1 && que[i]==0){
            if(i==y){    ///判断是否到达
                d=1;
            }
            backtrack(i,y);
        }
    }
}

int main()
{
    while(~scanf("%d%d",&n,&e))
    {
        int a,b,u,v,t;
        memset(q,0,sizeof(q));
        for(int i=1;i<=n;i++){
            q[i][i]=1;
        }
        for(int i=1;i<=e;i++){
            scanf("%d%d",&a,&b);
            q[a][b]=1;
        }
        scanf("%d",&t);
        while(t--)
        {
            d=0;
            memset(que,0,sizeof(que));
            scanf("%d%d",&u,&v);
            backtrack(u,v);
            if(d==1)
                printf("yes\n");
            else
                printf("no\n");
        }
        printf("\n");
    }
    return 0;
}
///n后问题

#include<bits/stdc++.h>
int n,sum,a[100];
bool place(int k)
{
    for(int i=1;i<k;i++){
        if((abs(k-i)==abs(a[i]-a[k])) || a[i]==a[k])
            return false;
    }
    return true;
}
void backtrack(int t)
{
    if(t>n)
        sum++;
    else{
        for(int i=1;i<=n;i++){
            a[t]=i;
            if(place(t))
                backtrack(t+1);
        }
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(a,0,sizeof(a));
        sum=0;
        scanf("%d",&n);
        backtrack(1);
        printf("%d\n",sum);
    }
}
///捕牛记

#include<bits/stdc++.h>
using namespace std;
#define Max 100010
int main()
{
    int n,k,a,t,w;
    int x[Max],time[Max],q[Max];
    while(scanf("%d%d",&n,&k))
    {
        if(n==-1 && k==-1){ /// 停止循环
            break;
        }
        memset(x,0,sizeof(x));
        time[k]=-1;
        time[n]=0;
        x[n]=1;
        q[0]=n;t=0;w=1;
        while(t<w && time[k]==-1)
        {
            a=q[t];
            t++;
            if(a+1>=0 && a+1<Max && x[a+1]==0){ /// 从a -> a+1
                x[a+1]=1;
                time[a+1]=time[a]+1;
                q[w]=a+1;
                w++;
                if(w==Max){
                    w=0;
                }
            }
            if(a-1>=0 && a-1<Max && x[a-1]==0){ /// 从a -> a-1
                x[a-1]=1;
                time[a-1]=time[a]+1;
                q[w]=a-1;
                w++;
                if(w==Max){
                    w=0;
                }
            }
            if(a*2>=0 && a*2<Max && x[a*2]==0){ /// 从a -> a*2
                x[a*2]=1;
                time[a*2]=time[a]+1;
                q[w]=a*2;
                w++;
                if(w==Max){
                    w=0;
                }
            }
        }
        printf("%d\n",time[k]);
    }
    return 0;
}
///用DFS计算pre和post

#include<bits/stdc++.h>
int n,e,num=1;
int pre[1002],post[1002],pp[1002],c[1002][1002];
void dfs(int t)
{
    pp[t]=1;
    pre[t]=num++;
    for(int i=1;i<=n;i++){
        if(c[t][i]==1&&!pp[i])
            dfs(i);
    }
    post[t]=num++;
}
int main()
{
    int a,b;
    scanf("%d%d",&n,&e);
    for(int i=1;i<=e;i++){
        scanf("%d%d",&a,&b);
        c[a][b]=1;
    }
    dfs(1);
    for(int i=1;i<=n;i++){
        printf("%d ",pre[i]);
    }
    printf("\n");
    for(int i=1;i<=n;i++){
        printf("%d ",post[i]);
    }
}
///分组背包

#include<bits/stdc++.h>
using namespace std;
int v[1002][1002],p[1002][1002],k[1002],dp[1002];
int main()
{
    int t,n,c;
    scanf("%d",&t);
    while(t--)
    {
        memset(dp,0,sizeof(dp));
        scanf("%d%d",&n,&c);
        for(int i=1;i<=n;i++){
            scanf("%d",&k[i]);
            for(int j=1;j<=k[i];j++){
                scanf("%d%d",&v[i][j],&p[i][j]);
            }
        }
        for(int i=1;i<=n;i++){
            for(int j=c;j>=0;j--){
                for(int x=1;x<=k[i];x++){
                    if(v[i][x]<=j){
                        dp[j]=max(dp[j],dp[j-v[i][x]]+p[i][x]);
                    }
                }
            }
        }
        printf("%d\n",dp[c]);
    }
}
///多重背包

#include<bits/stdc++.h>
using namespace std;
int w[10002],v[10002],dp[10002];
int main()
{
    int t,n,c;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&c);
        int num=0;
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++){
            int x,y,m,res=1;
            scanf("%d%d%d",&x,&y,&m);
            while(res<m){
                w[++num]=x*res;
                v[num]=y*res;
                m-=res;
                res*=2;
            }
            if(m>0){
                w[++num]=x*m;
                v[num]=y*m;
            }
        }
        for(int i=1;i<=num;i++){
            for(int j=c;j>=w[i];j--){
                dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
            }
        }
        printf("%d\n",dp[c]);
    }
}
///二维背包
#include<bits/stdc++.h>
using namespace std;
int v[1002],w[1002],p[1002],dp[1002][1002];
int main()
{
    int t,n,c,l;
    scanf("%d",&t);
    while(t--)
    {
        memset(dp,0,sizeof(dp));
        scanf("%d%d%d",&n,&c,&l);
        for(int i=1;i<=n;i++){
            scanf("%d%d%d",&v[i],&w[i],&p[i]);
        }
        for(int i=1;i<=n;i++){
            for(int j=c;j>=v[i];j--){
                for(int k=l;k>=w[i];k--){
                    dp[j][k]=max(dp[j][k],dp[j-v[i]][k-w[i]]+p[i]);
                }
            }
        }
        printf("%d\n",dp[c][l]);
    }
}
///超市搞活动

#include<bits/stdc++.h>
using namespace std;
int p[10002],q[10002],dp[10002];
int main()
{
    int c,n;
    while(~scanf("%d%d",&c,&n))
    {
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++){
            scanf("%d%d",&p[i],&q[i]);
        }
        for(int i=1;i<=n;i++){
            for(int j=q[i];j<=c;j++){
                dp[j]=max(dp[j],dp[j-q[i]]+p[i]);
            }
        }
        printf("%d\n",dp[c]);
    }
}
///租用游艇

#include<bits/stdc++.h>
using namespace std;
int r[202][202],dp[202];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            scanf("%d",&r[i][j]);
        }
    }
    dp[1]=0;
    dp[2]=r[1][2];
    for(int i=3;i<=n;i++){
        dp[i]=r[1][i];
        for(int j=2;j<i;j++){
            dp[i]=min(dp[i],dp[j]+r[j][i]);
        }
    }
    printf("%d\n",dp[n]);
}
View Code

 

标签:狂人日记,int,scanf,namespace,main,1002,dp
来源: https://www.cnblogs.com/c-xzp/p/14176655.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有