To solve Samuel's optimization problem, we first need to convert the natural language description into a symbolic representation. Let's denote the number of acres of wheat as $x_1$ and the number of acres of corn as $x_2$. The objective is to maximize profit.

The profit per acre of wheat is $50, and the profit per acre of corn is $90. Therefore, the total profit can be represented by the objective function: $50x_1 + 90x_2$.

There are several constraints:
1. **Land Constraint**: The total number of acres used for wheat and corn cannot exceed 90 acres. This can be represented as $x_1 + x_2 \leq 90$.
2. **Maintenance Cost Constraint**: Each acre of wheat requires $10 in maintenance, and each acre of corn requires $20 in maintenance. Samuel has at most $1400 to spend on maintenance. This constraint can be represented as $10x_1 + 20x_2 \leq 1400$.
3. **Care Time Constraint**: Each acre of wheat requires 4 hours of care, and each acre of corn requires 3 hours of care. Samuel has 90 hours available for care. This constraint can be represented as $4x_1 + 3x_2 \leq 90$.
4. **Non-Negativity Constraints**: The number of acres of wheat and corn cannot be negative, so we have $x_1 \geq 0$ and $x_2 \geq 0$.

Symbolic representation:
```json
{
    'sym_variables': [('x1', 'acres of wheat'), ('x2', 'acres of corn')],
    'objective_function': '50*x1 + 90*x2',
    'constraints': [
        'x1 + x2 <= 90', 
        '10*x1 + 20*x2 <= 1400', 
        '4*x1 + 3*x2 <= 90', 
        'x1 >= 0', 
        'x2 >= 0'
    ]
}
```

To solve this problem using Gurobi in Python, we can use the following code:

```python
from gurobipy import *

# Create a new model
m = Model("Samuel_Farm")

# Create variables
x1 = m.addVar(name='x1', vtype=GRB.CONTINUOUS, lb=0)
x2 = m.addVar(name='x2', vtype=GRB.CONTINUOUS, lb=0)

# Set the objective function
m.setObjective(50*x1 + 90*x2, GRB.MAXIMIZE)

# Add constraints
m.addConstr(x1 + x2 <= 90, name='land_constraint')
m.addConstr(10*x1 + 20*x2 <= 1400, name='maintenance_cost_constraint')
m.addConstr(4*x1 + 3*x2 <= 90, name='care_time_constraint')

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print(f'Optimal solution: x1 = {x1.x}, x2 = {x2.x}')
    print(f'Total profit: {50*x1.x + 90*x2.x}')
else:
    print('No optimal solution found')
```