Codeforces の 动态规划

Codeforces Round 785 (Div. 2) - C. Palindrome Basis

dp(9/100)
题目链接
思路:整数划分基础上加一个判断回文的条件
整数划分思路:背包容量为n,物品有体积为1~n n种,每种无数个,求使背包恰好装满的方案数——完全背包问题(传统的背包问题可能不会恰好装满,但此问题中如果背包有空余可以用1补齐,所以是一定会装满的)

#include 
// #pragma GCC optimize(3,"Ofast","inline")
// #pragma GCC optimize(2)
using namespace std;
typedef long long LL;
#define int LL
const int mod = 1e9 + 7;
const int N = 4e4 + 5;
int f[N];

void solve()
{ 
	int n;
	cin >> n;
	cout << f[n] << endl;
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);cout.tie(nullptr);
    int t = 1;
    cin >> t;
	f[0] = 1;
	for (int i = 1; i <= 4e4; i ++ ){
		string a = to_string(i);
		string b = a;
		reverse(a.begin(), a.end());
		if(a == b)
			for (int j = i; j <= 4e4; j ++ )
				f[j] = (f[j] + f[j - i]) % mod;			
	}
    while(t -- ) solve(); 
    system("pause");
    return 0;
}

Codeforces Round 113 (Div. 2) - E. Tetrahedron

dp(18/100)
题目链接
走n步的路线数是走n-2步的三倍加上走n-1步的两倍
当走到n-2步到达D点时,还可向A B C三个方向走一来一回
例如:
f[0] = 1(没有走动,就在原点)路线:D
f[2] 路线就有:
D - A - D;
D - B - D
D - C - D
走到n-1步到达D点的情况,可在当前步向除D以外的另外两点走一步再回到D。
例如:
f[3] 路线有:
D - A - B - D
D - A - C - D
D - B - A - D
D - B - C -D
D - C - A - D
D - C- B - D

#include 
using namespace std;
#define int long long
const int N = 1e7 + 10, mod = 1e9 + 7;
int f[N];

void solve()
{
    int n;
    cin >> n;
    f[0] = 1;
    f[1] = 0;
    for (int i = 2; i <= n; i ++ )
        f[i] = (2 * f[i - 1] + 3 * f[i - 2]) % mod;
    cout << f[n] << endl;
}

signed main()
{
    int t = 1;
    // cin >> t;
    while(t -- ) solve();
    return 0;
} 

Educational Codeforces Round 128 (Rated for Div. 2) - E. Moving Chips

dp(19/100)
题目描述
首先将输入的矩阵将两端都没有 ∗ * 的地方删去,剩下的一定会从左上角或者左下角走到右上角或者右下角。
初始化第一列,如果我的对面的位置有 ∗ * ,则需要从对面走过来则初始化为1,如果对面没有则初始化为0
之后的每一步,可以从斜角的位置走两步过来,也可以从旁边过来,但如果从旁边过来就要考虑当前步对面有没有 ∗ * ,如果有则需要再多加一步

#include 
using namespace std;
#define int long long
typedef long long LL;
const int N = 2e5 + 10;

void solve()
{   
    int n;
    cin >> n;
    string a[2];
    cin >> a[0] >> a[1];
    for (int i = 0; i < 2; i ++ ){
        while(a[0].back() == '.' && a[1].back() == '.'){
            a[0].pop_back();
            a[1].pop_back();
        }
        reverse(a[0].begin(), a[0].end());
        reverse(a[1].begin(), a[1].end());
    }
    n = a[0].size();
    int dp[n + 1][2];
    memset(dp, 0x3f, sizeof dp);
    dp[0][0] = (a[1][0] == '*');
    dp[0][1] = (a[0][0] == '*');
    for (int i = 1; i < n; i ++ ){
        dp[i][0] = min(dp[i - 1][1] + 2, dp[i - 1][0] + 1 + (a[1][i] == '*'));
        dp[i][1] = min(dp[i - 1][0] + 2, dp[i - 1][1] + 1 + (a[0][i] == '*'));
    }
    cout << min(dp[n - 1][0], dp[n - 1][1]) << endl;
}

signed main()
{
    // ios::sync_with_stdio(false);
    // cin.tie(0),cout.tie(0);
    int t = 1;
    cin >> t;
    while(t -- ) solve();
    system("pause");
    return 0;
} 

你可能感兴趣的:(动态规划,算法)