Description
As we know, an atom can be in different energy states (or “energy levels”). Usually, when it transits from a higher energy state to a lower one, it will emit a photon, whose energy is equal to the difference in energy of these two states. Absorption of photons is the reverse process. If a photon, whose energy equal to the difference in energy of two states of an atom, passes by, it may be absorbed and its energy will put the atom into a higher energy level. For most elements, the atom can transit between any two states directly, by emitting or absorbing only one photon.Scientists are puzzled by a new element that they discovered recently. For two certain energy states, the atom of this element can transit between them directly (emitting or absorbing one and only one photon), but for some other pairs of energy states, the atom cannot.
Generally speaking, when an atom transits among energy states one after another, a trail of events (emitting or absorbing a photon) occurs. For example, when transiting from energy state
Ei1 to Eit, the atom follows this sequence:
Ei1, Ei2, Ei3, …, Eik, …, Eit
Eik (1 <= k <= t) represents a certain energy state. During the of process of transiting from Eik to Eik+1 , one and only one photon is emitted or absorbed.
The atom can be in any energy state and transit to some other one. But as we mentioned above, for some pairs of energy states, this special atom cannot transit between them directly. What’s more,when its energy state changes from one to another, for example, from Ej1 to Ejw , it can only follow a unique sequence Ej1 ,Ej2 ,Ej3 ,… , Ejw . And the most interesting thing is that it can only follow another unique sequence Ejw, …,Ej3 ,Ej2 ,Ej1 , when it transits back from Ejw to Ej1 .You can find that it is the reversion of the former one! Right! Isn’t it special?
Now, the scientists need your help today. In an experiment, some atoms of this new element will be put into a container. Any two atoms would be regarded as “dangerous atoms” if they satisfy one of the following conditions:
•They are in the same energy state.
•They are in different energy states. But if one of them emits or absorbs a photon, they will be in the same states too.
You must make sure that there are no dangerous atoms in this container. And the higher the total energy of the atoms in the container is, the more easily will the experiment succeed.
Now, the scientists have told you all photons that the atoms of this element can emit or absorb, as well as the energy of all atom states. They ask you calculate the highest total energy that the atoms in the container can reach.
【题目分析】
题目中明确表示最终的图是一棵树。所以就是一道树型DP了。简直是模板题目。
【代码】
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#define m(a) memset(a,0,sizeof a)
using namespace std;
int a[201];
int map[201][201];
int dp[201][2];
int vis[201];
int b[1000001];
int n,m,x;
inline void dfs(int k)
{
vis[k]=1;
for (int j=1;j<=n;++j)
{
if (j==k) continue;
if (map[k][j])
if (!vis[j])
{
dfs(j);
dp[k][1]+=dp[j][0];
dp[k][0]+=max(dp[j][1],dp[j][0]);
}
}
dp[k][1]+=a[k];
}
int main()
{
while (cin>>n>>m)
{
if (n+m==0) return 0;
m(a);m(vis);m(map);m(dp);m(b);
for (int i=1;i<=n;++i) cin>>a[i];
for (int i=1;i<=m;++i) cin>>x,b[x]=1;
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j)
if (i!=j&&b[abs(a[i]-a[j])]) map[i][j]=1;
int ans=0;
for (int i=1;i<=n;++i)
if (!vis[i]) dfs(i),ans+=max(dp[i][0],dp[i][1]);
cout<<ans<<endl;
}
}