Fibonacci数列(简单)(dp)
Fibonacci数列_牛客题霸_牛客网 (nowcoder.com)
描述
Fibonacci数列是这样定义的:
F[0] = 0
F[1] = 1
for each i ≥ 2: F[i] = F[i-1] + F[i-2]
因此,Fibonacci数列就形如:0, 1, 1, 2, 3, 5, 8, 13, …,在Fibonacci数列中的数我们称为Fibonacci数。给你一个N,你想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X-1或者X+1,现在给你一个数N求最少需要多少步可以变为Fibonacci数。
输入描述:
输入为一个正整数N(1 ≤ N ≤ 1,000,000)
输出描述:
输出一个最小的步数变为Fibonacci数"
示例1
输入:
15
复制
输出:
2
代码
#include <iostream>
using namespace std;
int dp[1000010];
int main()
{
int a;
cin >> a;
dp[0] = 0;
dp[1] = dp[2] = 1;
for (int i = 3; i <= 1000000; i++)
{
dp[i] = dp[i - 1] + dp[i - 2];
if (dp[i] >= a)
{
int t1 = a - dp[i - 1];
int t2 = dp[i] - a;
cout << min(t1, t2);
break;
}
}
}
NC242 单词搜索 (简单)(dfs,bfs)(注意回溯)
给出一个二维字符数组和一个单词,判断单词是否在数组中出现, 单词由相邻单元格的字母连接而成,相邻单元指的是上下左右相邻。同一单元格的字母不能多次使用。 数据范围: 0 0 0 例如: 给出的数组为[“XYZE”,“SFZS”,“XDEE”]时, 对应的二维字符数组为: 若单词为"XYZZED"时,应该返回 true, 也即: 若单词为"SEE"时,应该返回 true, 也即: 若单词为"XYZY"时,应该返回 false。
示例1
输入
["XYZE","SFZS","XDEE"],"XYZZED"
输出
true
示例2
输入
["XYZE","SFZS","XDEE"],"SEE"
输出
true
示例3
输入
["XYZE","SFZS","XDEE"],"XYZY"
输出
false
代码
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* @param board string字符串vector
* @param word string字符串
@return bool布尔型
*/
int n, m;
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
bool vis[110][110];
bool dfs(vector<string>& board, int i, int j, string word, int pos)
{
if (pos == word.size()) return true;
vis[i][j] = true;
for (int k = 0; k < 4; k++) {
int x = dx[k] + i, y = dy[k] + j;
if (x >= 0 && x < n && y >= 0 && y < m && !vis[x][y] &&board[x][y]==word[pos])
{
bool t = dfs(board, x, y, word, pos + 1);
if (t == true) return true;
}
}
vis[i][j] = false;
return false;
}
bool exist(vector<string>& board, string word)
{
n = board.size();
m = board[0].size();
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (board[i][j] == word[0])
{
memset(vis, false, sizeof(vis));
bool t = dfs(board, i, j, word, 1);
if (t == true)
{
return true;
}
}
}
}
return false;
}
};
BC140 杨辉三角(简单)(模拟,dp)
描述
KiKi知道什么叫杨辉三角之后对杨辉三角产生了浓厚的兴趣,他想知道杨辉三角的前n行,请编程帮他解答。杨辉三角,本质上是二项式(a+b)的n次方展开后各项的系数排成的三角形。其性质包括:每行的端点数为1, 一个数也为1;每个数等于它左上方和上方的两数之和。
输入描述:
第一行包含一个整数数n。 (1≤n≤30)
输出描述:
包含n行,为杨辉三角的前n行,每个数输出域宽为5。
示例1
输入:
6
复制
输出:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
代码
#include <iostream>
#include<vector>
using namespace std;
vector<int> arr(35);
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
if(i==1)
{
printf("%5d",1);
arr[1]=1;
cout<<endl;
}
else
{
vector<int> t(35);
t[1]=1;
for(int j=2;j<=i;j++)
{
t[j]=arr[j]+arr[j-1];
}
for(int j=1;j<=i;j++)
{
printf("%5d",t[j]);
}
arr=t;
cout<<endl;
}
}
}