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;
}
原文地址:https://www.cnblogs.com/dowson/p/3329758.html