2018 女生赛--HDU - 6294(简单dp)
一开始暴力了一发 , 果然不对
原来是dp啊
题意:
给你一个长度为n的字符串 s1 ,
令X = s1[i.....n]
Y = s1[i+1.....n]
输出n-1个答案 , 判断X和Y的字典序大小
题目给了俩个条件:
- 如果Y的长度为k 并且 X的前k个和Y相等 , 那么X大
- 如果Y的长度大于k 并且 X的前k个和Y的前k个相等 那么判断k+1的X和Y的大小
举个例子:
S1: x1x2x3x4x5;
那么
- x1 x2 x3 x4 x5
x2 x3 x4 x5
- X2 x3 x4 x5
X3 x4 x5
- X3 x4 x5
X4 x5
- X4 x5
X5
很明显发现若求1时 , 只要比较x1 和x2 就行 , 如果相等就可以直接调用2的答案,同理下面
那么可以倒着求
令dp[i][j] = 0 表示s1>s2 , dp[i][j]=1 表示小于 。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+8;
int dp[maxn];
int main()
{
int t , n;
char str[maxn];
scanf("%d" , &t);
while(t--)
{
memset(dp , -1 , sizeof(dp));
scanf("%d" , &n);
scanf("%s" , &str);
if(str[n-1] <= str[n-2])dp[n-1] = 0;
else dp[n-1] = 1;
for(int i = n-2 ; i > 0 ; i--)
{
if(str[i] > str[i-1])
{
dp[i] = 1;
}
else if(str[i] < str[i-1])
{
dp[i] = 0;
}
else
{
dp[i] = dp[i+1];
}
}
for(int i = 1 ; i < n ; i++)
{
// printf("%d " , dp[i]);
if(dp[i] == 0)
printf(">");
if(dp[i] == 1)
printf("<");
}
printf("\n");
}
return 0;
}