hdu 2452+hdu 1501
18573 ワード
テーマリンク:
http://acm.hdu.edu.cn/showproblem.php?pid=2452
http://acm.hdu.edu.cn/showproblem.php?pid=1501
記憶化検索。簡単に言うと、dfs+ステータスマークです。
View Code
View Code
http://acm.hdu.edu.cn/showproblem.php?pid=2452
http://acm.hdu.edu.cn/showproblem.php?pid=1501
記憶化検索。簡単に言うと、dfs+ステータスマークです。
View Code
1 #include<iostream>
2 #include<vector>
3 const int MAXN=10000+10;
4 const int inf=1<<30;
5 using namespace std;
6 int n,m,f;
7 vector<int>mp[MAXN];
8 int value[MAXN];
9 int In[MAXN],Out[MAXN];
10 int dp[MAXN][2];
11
12 int dfs(int now,int mark){
13 //vector
14 if(mark==1){
15 if(dp[now][1]!=-1){
16 return dp[now][1];
17 }
18 int MAX=0;
19 for(int i=0;i<mp[now].size();i++){
20 int ans=dfs(mp[now][i],0);//
21 if(ans>MAX)MAX=ans;
22 }
23 dp[now][1]=MAX+value[now];
24 return dp[now][1];
25 }else {
26 if(dp[now][0]!=-1){
27 return dp[now][0];
28 }
29 int MIN=inf;
30 for(int i=0;i<mp[now].size();i++){
31 int ans=dfs(mp[now][i],1);
32 if(ans<MIN)MIN=ans;
33 }
34 if(MIN==inf)dp[now][0]=value[now];
35 else dp[now][0]=MIN+value[now];
36 return dp[now][0];
37 }
38 }
39
40 int main(){
41 while(~scanf("%d%d%d",&n,&m,&f)){
42 memset(In,0,sizeof(In));
43 memset(Out,0,sizeof(Out));
44 memset(dp,-1,sizeof(dp));
45 for(int i=1;i<=n;i++){
46 scanf("%d",&value[i]);
47 mp[i].clear();
48 }
49 for(int i=1;i<=m;i++){
50 int x,y;
51 scanf("%d%d",&x,&y);
52 In[y]++,Out[x]++;
53 mp[x].push_back(y);
54 }
55 int start=1;
56 //
57 for(int i=1;i<=n;i++)if(In[i]==0){
58 start=i;
59 break;
60 }
61 int ans=dfs(start,1);//1-vector,0-glory;
62 if(ans>=f){
63 printf("Victory
");
64 }else
65 printf("Glory
");
66 }
67 return 0;
68 }
View Code
1 #include<iostream>
2 #include<cstring>
3 const int MAXN=222;
4 using namespace std;
5 int len1,len2,len;
6 char str1[MAXN],str2[MAXN],str[MAXN<<1];
7 bool mark[MAXN][MAXN];
8
9
10 bool dfs(int pos1,int pos2,int pos){
11 if(pos==len){
12 return true;
13 }
14 if(mark[pos1][pos2])return false;
15 mark[pos1][pos2]=true;
16 if(str1[pos1]==str[pos]){
17 if(dfs(pos1+1,pos2,pos+1))return true;
18 }
19 if(str2[pos2]==str[pos]){
20 if(dfs(pos1,pos2+1,pos+1))return true;
21 }
22 return false;
23 }
24
25
26 int main(){
27 int _case,k=1;
28 scanf("%d",&_case);
29 while(_case--){
30 scanf("%s%s%s",str1,str2,str);
31 printf("Data set %d: ",k++);
32 len1=strlen(str1);
33 len2=strlen(str2);
34 len=strlen(str);
35 memset(mark,false,sizeof(mark));
36 if(len1+len2!=len){
37 printf("no
");
38 }else if(dfs(0,0,0)){
39 printf("yes
");
40 }else
41 printf("no
");
42 }
43 return 0;
44 }