zoukankan      html  css  js  c++  java
  • 1770Special Experiment

    这道题目还是有些歧义,成了环形就难办了啊,感觉就用不了dp了,不符合无后性了

    这道题目是树形dp,用了一个晚上学习树形dp

    不过我的代码没有通过

    #include "iostream"
    #include "cmath"
    #include "string.h"
    using namespace std;
    int main(){
      int n,m,i,j,k,state[220],low[220][220],high[220],set[220],f[220][2],a,b,photon[220],shu[220][220];
      while(cin>>n>>m&&n&&m){
        for(i=1;i<=n;i++){cin>>state[i];low[i][0]=0;high[i]=0;}
        for(i=1;i<=m;i++)cin>>photon[i];
        for(i=1;i<n;i++){
          for(j=i+1;j<=n;j++){
            for(k=1;k<=m;k++){
              if(abs((float)state[i]-(float)state[j])==photon[k]){
                high[i]=j;high[j]=i;
                low[j][0]++;//low[i][0]++;
                low[j][low[j][0]]=i;//low[i][low[i][0]]=j;
              }
            }
          }
        }
        int MAX=0;
        for(i=1;i<=n;i++)shu[i][0]=0;
        for(i=1;i<=n;i++){
          int x=i,s=1;
          memset(set,0,sizeof(set));
          while(high[x]!=0&&!set[x]){set[x]=1;x=high[x];s++;}
          shu[s][0]++;
          shu[s][shu[s][0]]=i;
          if(s>MAX)MAX=s;
        }
        for(i=MAX;i>=1;i--){
          for(j=1;j<=shu[i][0];j++){
            if(low[shu[i][j]]==0){
                f[shu[i][j]][0]=0;f[shu[i][j]][1]=state[shu[i][j]];
            }
            else {
               f[shu[i][j]][0]=0;f[shu[i][j]][1]=state[shu[i][j]];
               for(k=1;k<=low[shu[i][j]][0];k++){
    
                 a=f[low[shu[i][j]][k]][0];
                 b=f[low[shu[i][j]][k]][1];
                 f[shu[i][j]][1]+=a;
                 if(a<b)a=b;
                 f[shu[i][j]][0]+=a;
               }
            }
            cout<<shu[i][j]<<' '<<f[shu[i][j]][0]<<' '<<f[shu[i][j]][1]<<endl;
          }
        }
        cout<<high[1]<<"*****"<<endl;
       int s=0;
       for(i=1;i<=shu[1][0];i++){
         a=f[shu[1][i]][0];b=f[shu[1][i]][1];
         if(a<b)a=b;
         s+=a;
       }
       cout<<s<<endl;
      }
    }

    人家的代码,有很多要学习的地方啊,比如光子,人家用了一个p数组就少了一个for循环,不错啊,而且人家是递归式的,而我是循环式的,他那样比较容易记住形式

    #include<iostream>
    #include<stack>
    #include<queue>
    #include<stdio.h>
    #include<algorithm>
    #include<string.h>
    #include<cmath>
    #define ll long long
    #define oo 1000000007
    #define MAXN 205
    using namespace std; 
    vector<int> Tree[MAXN];
    int n,m,a[MAXN],dp[MAXN][2];
    bool P[1000005],used[MAXN],root[MAXN];
    void dfs(int x)
    {
          int i,num=Tree[x].size(); 
          used[x]=true;
          dp[x][0]=0,dp[x][1]=a[x];
          for (i=0;i<num;i++)
            if (!used[Tree[x][i]])
            {
                  dfs(Tree[x][i]);
                  dp[x][0]+=max(dp[Tree[x][i]][0],dp[Tree[x][i]][1]);
                  dp[x][1]+=dp[Tree[x][i]][0];
            }
          return;
    }
    int main()
    {
          int i,x; 
          while (~scanf("%d%d",&n,&m) && (n || m))
          {
                for (i=1;i<=n;i++) scanf("%d",&a[i]),Tree[i].clear();
                sort(a+1,a+1+n);
                memset(P,false,sizeof(P)); 
                P[0]=true;
                for (i=1;i<=m;i++) scanf("%d",&x),P[x]=true;
                memset(root,true,sizeof(root)); 
                for (i=1;i<=n;i++)
                  for (x=i+1;x<=n;x++)
                     if (P[a[x]-a[i]])
                       Tree[x].push_back(i),Tree[i].push_back(x);
                memset(used,false,sizeof(used));
                x=0;
                for (i=1;i<=n;i++) 
                 if (!used[i])
                  { 
                        dfs(i);
                        x+=max(dp[i][0],dp[i][1]);
                  }
                printf("%d
    ",x);
          }
          return 0;
    }
  • 相关阅读:
    如何在IIS7/7.5上配置IISADMPWD
    运用DebugDiag诊断ASP.Net异常
    vuecli3修改项目启动端口
    彻底删除vscode及安装的插件和个人配置信息
    angular中的 input select 值绑定无效,以及多出一个空白选项问题
    简述MVC模式
    vuecli3 运行报错
    前端开发规范
    nodejs 下载最新版本
    小程序 自定义弹窗出现后存在滚动穿透问题
  • 原文地址:https://www.cnblogs.com/dowson/p/3329758.html
Copyright © 2011-2022 走看看