链接:点击打开链接
题意:给出一个矩阵S,S[i][j]表示数列a从a[i]+...a[j]和的大小,输出可能的数列
代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
int N,cnt;
int ans[105],head[105],indegree[105];
int que[105];
struct node{
int to,next;
}G[505];
void addedge(int u,int v){
G[cnt].to=v;
G[cnt].next=head[u];
head[u]=cnt++;
}
int main(){ //因为每一个s[i][j]可以用a的前缀和表示,因此
char str[105]; //用前缀和构造拓扑排序
int i,j,t,k,u,v,sum,sign;
scanf("%d",&t);
while(t--){
scanf("%d",&N);
scanf("%s",str);
k=cnt=0;sum=10;
memset(head,-1,sizeof(head));
memset(indegree,0,sizeof(indegree));
for(i=0;i<N;i++){
for(j=i;j<N;j++){
if(str[k]=='+'){
addedge(j+1,i);
indegree[i]++;
}
else if(str[k]=='-'){
addedge(i,j+1);
indegree[j+1]++;
}
k++;
} //同一层的值要相同,才能保证是0
}
k=0;
for(i=0;i<=N;i++)
if(indegree[i]==0){
ans[i]=sum;
que[k++]=i;
}
for(i=0;i<k;i++){
sign=1;
for(j=head[que[i]];j!=-1;j=G[j].next){
indegree[G[j].to]--;
if(indegree[G[j].to]==0){
if(sign==1)
sum--;
ans[G[j].to]=sum;
que[k++]=G[j].to;
sign=0;
}
}
}
for(i=1;i<=N;i++)
printf("%d ",ans[i]-ans[i-1]);
printf("\n");
}
return 0;
}