您的位置:首页 > 其它

hdu 4055 Number String【2011 ACM Asia Dalian Regional Problem E】

2011-10-15 11:20 387 查看
hdu 4055 Number String

另类作法:dp[i][j]表示第i位前面没有用过的数字比他小的有j个,对于某个i,j的一种状态第i+1位的选择都能唯一的到达另外一种状态,最后输出dp[len][0]即可,另外还有合法串的变换进行DP . 另外n^3需要化为n^2 .

View Code

///自己的做法
inline void gao()
{
int i,j;
int len=strlen(s);
int idx;
n=len+1;
memset(dp,0,sizeof(dp));
memset(sum,0,sizeof(sum));
int temp=0;
for(i=0;i<=n-1;i++)
{
dp[0][i]=1;
temp+=1;
sum[0][i]=temp;
}
for(i=1,idx=0;i<=len;idx++,i++)
{
int temp=0;
for(j=0;j<=n-1;j++)
{
//if(i+j>=n) break;
///这里不能搞掉 因为这里还有个sum[j]要处理 要搞出sum[n-1]~~
if(s[idx]=='D')
{
dp[i][j]=sum[i-1][n-1]-sum[i-1][j];
if(dp[i][j]<0) dp[i][j]+=mood;
}
else
if(s[idx]=='I')
{
if(j<=n-i-1)
dp[i][j]=sum[i-1][j];
}
else
{
dp[i][j]=sum[i-1][n-1]-sum[i-1][j];
if(dp[i][j]<0) dp[i][j]+=mood;
if(j<=n-i-1)
dp[i][j]+=sum[i-1][j];
if(dp[i][j]>=mood) dp[i][j]-=mood;
}
temp+=dp[i][j];
if(temp>=mood) temp-=mood;
sum[i][j]=temp;
}
}
printf("%d\n",dp[len][0]);
}
///网上流传作法:
这题最需要理解的一个性质是当加入一个新的数n时,如果想把n放在前n-1个位置的任何一个,

并且不影响升降性质,只需要在之前方案中把当前在n位置的数x(n放前面必然有一个x要放在n的位置)

所有的大于等于x的数都加1即可。比如之前方案是(1,5,3,2,4),现在把3放在第6位。

则对应方案是(1,6,4,2,5,3)。(1,2不变,其他加一)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐