我要开始做USACO的DP以对抗智力下降

P6205 [USACO06JAN] Dollar Dayz S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题解:完全背包,__int128,傻逼题

#include<bits/stdc++.h>
using namespace std;
__int128 f[10001];
void write(__int128 x)
{
    if(x>9) write(x/10); 
    putchar(x%10+'0');
}
int main()
{
    int n,k;
    cin>>n>>k;
    f[0]=1;
    for(int i=1;i<=k;i++)
    {
        for(int j=i;j<=n;j++)
        {
            f[j]+=f[j-i];
        }
    }
    write(f[n]);
    return 0;
}

P6208 [USACO06OCT] Cow Pie Treasures G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题解:f[ i ][ j ] 可以被f[ i ][ j-1 ],f[ i-1 ][ j-1 ],f[ i+1 ][ j-1 ] 这个题目比较关键的地方我认为是,列数每次都会+1,这样就带来的可以从小列数到大列数递推的可能(所以应该先枚举j,j<=c)。that's a easy problem.

#include<bits/stdc++.h>
using namespace std;
int a[101][101];
int f[110][110];
int main()
{
    memset(f,-0x3f,sizeof f);
    int r,c;
    cin>>r>>c;
    for(int i =1;i<=r;i++)
    {
        for(int j=1;j<=c;j++)
        {
            cin>>a[i][j];
        }
    }
    f[1][1]=a[1][1];
    for(int j=2;j<=c;j++)
    {
        for(int i=1;i<=r;i++)
        {
            f[i][j]=max(f[i][j-1],max(f[i+1][j-1],f[i-1][j-1]))+a[i][j];
        }
    }
    cout<<f[r][c]<<endl;
    return 0;
}

 

posted @ 2023-08-01 14:49  hxwxss  阅读(10)  评论(0编辑  收藏  举报