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;
}
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;
}
相关文章推荐
- 详解Android应用中屏幕尺寸的获取及dp和px值的转换
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- Android dpi,dip,dp的概念以及屏幕适配
- Android px、dp、sp之间相互转换
- HP data protector软件学习1--基本角色与基本工作流程
- HP data protector软件学习2--软件组成与界面介绍
- android中像素单位dp、px、pt、sp的比较
- Android对px和dip进行尺寸转换的方法
- Android根据分辨率进行单位转换-(dp,sp转像素px)
- android 尺寸 dp,sp,px,dip,pt详解
- DP问题各种模型的状态转移方程
- POJ-1695-Magazine Delivery-dp
- nyoj-1216-整理图书-dp
- TYVJ1193 括号序列解题报告
- 对DP的一点感想
- TYVJ上一些DP的解题报告
- soj1005. Roll Playing Games
- 01背包问题