这题竟然是图论···orz

题意:给出一个整数序列a1,a2,……,可以得到如下矩阵

1 2 3 4

1 - + 0 +

2   + + +

3       -  -

4         +

“-”表示从ai到aj的和是负数,“+”表示和是正数,“0”表示和是0。现给出矩阵,求序列,每个整数的绝对值不超过10。

解法:转化为前缀和问题,矩阵可以表示前缀和的关系,用b表示前缀和,例如“-”表示b[j]-b[i-1]<0,即b[j]<b[i-1]。通过矩阵得到所有前缀和之间的关系,通过拓扑排序解出所有前缀和(任意一组解)。记录每个前缀和比它大的前缀和的个数,和比它小的前缀和都有哪些,找到比自己大的前缀和的个数为0的赋值为10(前缀和最大值),将比它小的前缀和的比它们大的前缀和数减一,如此循环,下次赋值为9。

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define ll long long
using namespace std;
char sign[15][15];
int bigger[15];//比自己大的前缀和个数
vector<int> v[15];//比自己小的前缀和们
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(sign,'\0',sizeof(sign));
memset(bigger,0,sizeof(bigger));
for(int i=0; i<15; i++)
v[i].clear();
int n;
int b[15]= {0};
scanf("%d",&n);
char str[200];
scanf("%s",str);
int k=0;
for(int i=1; i<=n; i++)
for(int j=i; j<=n; j++)
{
sign[i][j]=str[k++];
if(sign[i][j]=='-')
{
bigger[j]++;
v[i-1].push_back(j);
}
else if(sign[i][j]=='+')
{
bigger[i-1]++;
v[j].push_back(i-1);
}
}
int sum=10;
while(1)
{
queue<int> q;
int flag=1;
for(int i=0; i<=n; i++)
{
if(bigger[i]==0)
{
bigger[i]--;
flag=0;
b[i]=sum;
q.push(i);
}
}
if(flag)
break;
else
{
while(!q.empty())
{
int i=q.front();
q.pop();
for(int j=0; j<v[i].size(); j++)
bigger[v[i][j]]--;
}
sum--;
}
}
for(int i=1; i<=n; i++)
{
if(i!=1)
cout<<" ";
cout<<b[i]-b[i-1];
}
cout<<endl;
}
return 0;
}

代码好丑···

12341-+0+2+++3--4+

最新文章

  1. JAVA编程“性能说”(java编程需要做的26件事)
  2. SimpleDateFormat 12小时制以及24小时制的写法
  3. android 实现桌面显示内容
  4. 在Linux Ubuntu上编译DNX
  5. 自定义弧形的 tabBar
  6. IOS UI 笔记整理回顾
  7. xcode 6 出现的新问题
  8. Help Jimmy ~poj-1661 基础DP
  9. shell练习题7
  10. s21day22 python笔记
  11. Windows上的字符转换之CP_ACP和CP_OEMCP
  12. UOJ #164. 【清华集训2015】V | 线段树
  13. (23)ajax实现上传文件的功能
  14. elasticsearch-环境搭建
  15. 【CF878D】Magic Breeding bitset
  16. windows server 2008 R2 无法启用&quot;网络发现&quot; 需要启动的服务
  17. MCI 录制指定格式音频
  18. 超详细 Spring @RequestMapping 注解使用技巧 (转)
  19. FPGA学习之路——PLL的使用
  20. CCCC练习即感

热门文章

  1. WCF入门(七)——异常处理1
  2. package.json 字段全解析 share
  3. hdu 1275 两车追及或相遇问题
  4. Project Euler 99:Largest exponential 最大的幂
  5. lintcode 中等题 :Maximum Product Subarray 最大连续乘积子序列
  6. [GCJ]Password Attacker
  7. 【Linux高频命令专题(14)】nl
  8. SpringMVC学习总结(五)——SpringMVC文件上传例子
  9. git Unstaged changes after reset
  10. I&#178;C接口学习总结