HDU_2067 小兔的棋盘(DP)
2015-06-27 11:19
447 查看
题目请点这里
题解:
这道题目要求不能穿过对角线,而上下的情况是一样的。我们可以仅考虑一边,是一道动态规划的题目。从画图可以看出,当格点不再对角线上时可以从上方dp[i-1][j]以及左方dp[i][j-1]两个格点直接到达,而位于对角线上时,由于不能穿过对角线,只能从一边到达。所以得到状态方程:
dp[i][j] = dp[i][j-1];(i = j)
dp[i][j] = dp[i][j-1]+dp[i-1][j];(i != j)
代码实现:
题解:
这道题目要求不能穿过对角线,而上下的情况是一样的。我们可以仅考虑一边,是一道动态规划的题目。从画图可以看出,当格点不再对角线上时可以从上方dp[i-1][j]以及左方dp[i][j-1]两个格点直接到达,而位于对角线上时,由于不能穿过对角线,只能从一边到达。所以得到状态方程:
dp[i][j] = dp[i][j-1];(i = j)
dp[i][j] = dp[i][j-1]+dp[i-1][j];(i != j)
代码实现:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #define MAX 40 #define LL long long using namespace std; LL dp[MAX][MAX]; int N,key; void pre(); int main(){ key = 1; pre(); while( scanf("%d",&N) && N != -1 ){ printf("%d %d %I64d\n",key,N,dp *2); key++; } return 0; } void pre(){ memset(dp,0,sizeof(dp)); for( int i = 0; i < MAX; i++ ){ dp[i][0] = 1; } for( int i = 1; i < MAX; i++ ){ for( int j = 1; j <= i; j++ ){ if( i == j ){ dp[i][j] = dp[i][j-1]; } else dp[i][j] = dp[i-1][j] + dp[i][j-1]; } } }
相关文章推荐
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- Android px、dp、sp之间相互转换
- android中像素单位dp、px、pt、sp的比较
- Android对px和dip进行尺寸转换的方法
- Android根据分辨率进行单位转换-(dp,sp转像素px)
- android 尺寸 dp,sp,px,dip,pt详解
- DP问题各种模型的状态转移方程
- TYVJ1193 括号序列解题报告
- 对DP的一点感想
- TYVJ上一些DP的解题报告
- soj1005. Roll Playing Games
- 01背包问题
- LeetCode之Maximum Product Subarray
- DP Flow
- zoj3605 Find the Marble(三维dp)
- Word Break I,II, Triangle,Palindrome Partitioning 动态规划 DP
- Unique Paths I,II, Minimum Path Sum
- Gas Station