您的位置:首页 > 其它

hdu 5062(dp)

2016-06-26 15:40 274 查看
题意:求1到10的n次方的范围内,满足:

1、是回文数;

2、回文的前半部分满足升序;

解题思路:dp[i][j]第i个数是j的递增序列的个数。假设求k位数满足条件的序列个数,只需要求出dp[k/2][1.....9]的总和即可。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int dp[10][10];
void init() {
dp[0][1] = 1;
for(int i = 1; i <= 9; i++) dp[1][i] = 1;
for(int i = 2; i <= 6; i++)
for(int j = 1; j <= 9; j++)
for(int k = 1; k < j; k++)
dp[i][j] += dp[i-1][k];
}

int main() {
int t,n;
init();
scanf("%d",&t);
while(t--) {
scanf("%d",&n);
if(n == 0) {
printf("1\n");
continue;
}
int ans = 0;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= 9; j++) {
if(i % 2 == 0)
ans += dp[i / 2][j];
else ans += dp[i / 2 + 1][j];
}
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp