英语中,有些单词可以出现在其他单词后面。例如“Love”可以出现在“I”之后,“You”可以出现在“Love”之后,因此它们能构成“I Love You”这句话。
现在给你一些单词间的关系,你能计算出最多能有几个单词组合在一起构成一句话吗?
输入包含多组数据。
每组数据的第一行包含一个正整数n (1≤n≤10000)。
紧接着n行单词关系,每行包含两个单词A和B,表示单词B能出现在A后面。单词长度不超过32个字符,并且只有字母组成。
不存在循环的依赖关系。
对应每组数据,输出最多有几个单词能构成一个句子。
1 hello world 3 I love love you love me
2 3
#include<map>
#include<vector>
#include<string>
#include<iostream>
#include<set>
#include<algorithm>
using namespace std;
map<string,vector<string> > G;
map<string,int> dp;
int d(string);
int main(){
int N,i;
while(cin>>N){
G.clear();
dp.clear();
set<string> s;
for(i=0;i<N;i++){
string x,y;
cin>>x>>y;
G[x].push_back(y);
s.insert(x),s.insert(y);
}
int Max=0;
set<string>::iterator it;
for(it=s.begin();it!=s.end();it++)
Max=max(Max,d(*it));
printf("%d\n",Max);
}
}
int d(string x){
if(dp.count(x)) return dp[x];
dp[x]=1;
vector<string> &dict=G[x];
int i;
for(i=0;i<dict.size();i++)
dp[x]=max(dp[x],d(dict[i])+1);
return dp[x];
}//DAG上的动态规划,用map代替数组来实现dp import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; /** * Created by mengfanshan on 2017/7/18. * 英语中,有些单词可以出现在其他单词后面。例如“Love”可以出现在“I”之后,“You”可以出现在“Love”之后,因此它们能构成“I Love You”这句话。 现在给你一些单词间的关系,你能计算出最多能有几个单词组合在一起构成一句话吗? 输入描述: 输入包含多组数据。 每组数据的第一行包含一个正整数n (1≤n≤10000)。 紧接着n行单词关系,每行包含两个单词A和B,表示单词B能出现在A后面。单词长度不超过32个字符,并且只有字母组成。 不存在循环的依赖关系。 输出描述: 对应每组数据,输出最多有几个单词能构成一个句子。 示例1 输入 1 hello world 3 I love love you love me 输出 2 3 思路:使用图的最短路径算法,找到距离最长的两个点(不包含两个点之间不连通的情况) */ public class zuichangjuzi { public static int getLongestPath(int[][] array) { int[] distince=new int[array.length]; for (int i=0;i<array.length;i++) { int rudu=0; for (int j=0;j<array.length;j++) { if(array[j][i]==1) { rudu=rudu+array[j][i]; } } distince[i]=rudu; } Queue<Integer> _zeroQueue=new LinkedList<>(); for (int i=0;i<distince.length;i++) { if(distince[i]==0) { _zeroQueue.add(i); distince[i]=-1; } } //存储末尾节点为i的最长路径的长度 int[] maxpath=new int[array.length]; while (!_zeroQueue.isEmpty()) { int node = _zeroQueue.poll(); //System.out.println("node="+node); //减少这个点连接的点的入度 for (int i=0;i<distince.length;i++) { if(array[node][i]>0) { distince[i]=distince[i]-1; } //System.out.println("distince="+distince[i]); if(distince[i]==0) { _zeroQueue.add(i); distince[i]=-1; } } int max=0; for (int j = 0; j < array.length; j++) { if (array[j][node] == 1) { if(maxpath[j]+1>max) { max=maxpath[j]+1; } } } maxpath[node]=max; } int max=0; for (int i=0;i<maxpath.length;i++) { if(maxpath[i]>max) { max=maxpath[i]; } //System.out.println(maxpath[i]); } return max; } static int maxvalue=100000; public static void main(String[] args)throws IOException { BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in)); String l=bufferedReader.readLine(); while (l!=null) { int sentencecount=Integer.valueOf(l); ArrayList<String> sentencelist=new ArrayList<>(); ArrayList<String> wordlist=new ArrayList<>(); for (int i=0;i<sentencecount;i++) { String s=bufferedReader.readLine(); sentencelist.add(s); String[] var=s.split(" "); for (int j=0;j<var.length;j++) { if(!wordlist.contains(var[j])) { wordlist.add(var[j]); } } } int[][] array=new int[wordlist.size()][wordlist.size()]; for (int i=0;i<sentencecount;i++) { String line=sentencelist.get(i); String[] var=line.split(" "); int index1=wordlist.indexOf(var[0]); int index2=wordlist.indexOf(var[1]); // System.out.println("index1="+index1+","+index2+","+line+","+var[0]+","+var[1]); array[index1][index2]=1; } System.out.println("wordlist="+wordlist); for (int i=0;i<array.length;i++) { for (int j=0;j<array.length;j++) { System.out.print(array[i][j]+" "); } System.out.println(); } int max =getLongestPath(array); System.out.println(max+1); l=bufferedReader.readLine(); } } }
不断的遍历入度为0的节点,直至所有节点都被遍历。
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<functional>
#include <map>
#include <set>
#include <unordered_set>
#include <unordered_map>
#include <exception>
#include <iomanip>
#include <memory>
#include <sstream>
using namespace std;
int main(int argc, char** argv)
{
int n;
while (cin >> n && n >= 1 && n <= 10000)
{
unordered_map<string, int> hs;
unordered_map<int, vector<int>> graph;
unordered_map<int, int> inDegree;
for (int i = 0; i < n; ++i)
{
string from, to;
cin >> from >> to;
if (hs.find(from) == hs.end())
{
hs.emplace(from, hs.size());
inDegree[hs[from]] = 0;
}
if (hs.find(to) == hs.end())
{
hs.emplace(to, hs.size());
inDegree[hs[to]] = 0;
}
graph[hs[from]].emplace_back(hs[to]);
++inDegree[hs[to]];
}
int maxLen = 1;
while (true)
{
unordered_map<int, int> next;
for (auto& pr : inDegree)
{
if (pr.second == 0)
{
--pr.second;
for (auto& i : graph[pr.first]) ++next[i];
}
}
if (next.empty()) break;
++maxLen;
for (auto& pr : next) inDegree[pr.first] -= pr.second;
}
cout << maxLen << endl;
}
return 0;
}
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
Map<String, List<String>> mapper = new HashMap<>();
int k = sc.nextInt();
for (int i = 0; i < k; i++) {
String from = sc.next();
String to = sc.next();
if (!mapper.containsKey(from)) {
mapper.put(from, new ArrayList<>());
}
if (!mapper.containsKey(to)) {
mapper.put(to, new ArrayList<>());
}
mapper.get(from).add(to);
}
int max = -1;
Map<String, Integer> save = new HashMap<>();
for (String s : mapper.keySet()) {
int temp = dp(save, mapper, s);
if (temp > max) {
max = temp;
}
}
System.out.println(max);
}
}
private static int dp(Map<String, Integer> save, Map<String, List<String>> mapper, String s) {
if (mapper.get(s).isEmpty()) {
return 1;
}
if (!save.containsKey(s)) {
int max = -1;
for (String ss : mapper.get(s)) {
int temp = dp(save, mapper, ss) + 1;
if (temp > max)
max = temp;
}
save.put(s, max);
}
return save.get(s);
}
}
动态规划求解