题目描述
一个环上有10个点,编号为0-9,从0点出发,每步可以顺时针到下一个点,也可以逆时针到上一个点,求:经过n步又回到0点有多少种不同的走法?
举例
如果n=1,则从0出发只能到1或者9,不可能回到0,共0种走法
如果n=2,则从0出发有4条路径:0->1->2, 0->1->0, 0->9->8, 0->9->0,其中有两条回到了0点,故一共有2种走法
和剑指offer上那个机器人走路有点像,感觉好久没刷动态规划的题了
public class Solution {
public int GetSteps(int n,int k){
if(n == 1){
return 0;
}
if(n == 2){
if(k % 2 == 0){
return 1;
}
return 0;
}
//dp[i][j] 代表到达i这个点,走j步的情况数
int[][] dp = new int[n][k + 1];
dp[0][0] = 1;
for(int j = 1;j <= k;j++){
for(int i = 0;i < n;i++){
dp[i][j] = dp[(i - 1 + n) % n][j - 1] + dp[(i + 1) % n][j - 1];
}
}
return dp[0][k];
}
}
2.已知一个三角形的三个顶点,判断一个点是否在三角形中?
public final class Demo {
public static boolean isInTriangle(POINT A, POINT B, POINT C, POINT P) {
double ABC = triAngleArea(A, B, C);
double ABp = triAngleArea(A, B, P);
double ACp = triAngleArea(A, C, P);
double BCp = triAngleArea(B, C, P);
if (ABC == ABp + ACp + BCp) {// 若面积之和等于原三角形面积,证明点在三角形内
return true;
} else {
return false;
}
}
private static double triAngleArea(POINT A, POINT B, POINT C) {// 由三个点计算这三个点组成三角形面积
double result = Math.abs((A.x * B.y + B.x * C.y + C.x * A.y - B.x * A.y - C.x * B.y - A.x * C.y) / 2.0D);
return result;
}
}